ペイントソフト開発日誌

日々の出来事を殴り書き

クラステンプレート版 std::same_as の作り方

std::same_asのクラステンプレート版が作れないかな~とネットを調べてたら、簡単なやり方を見つけたのでメモ。

std::same_asって何?

std::same_asとはc++20で導入されたコンセプトの一つです。
コンセプトというのは一言で言うならテンプレートパラメータで渡せる型を制限するための言語仕様です。
例えば、TestというクラステンプレートのテンプレートパラメータをBaseクラスの派生クラスのみにしたい場合は、以下のようなコードを書きます。

#include <concepts>

class Base {};

template <std::derived_from<Base> Type>
class Test {};

std::same_asは任意の型が特定の型と同じかどうかを表します。
当然、任意の型が特定のクラステンプレートと同じかどうかを判定するのには使えません。

材料

ジェネリックラムダのテンプレート構文

cpprefjp.github.io

実装

#include <iostream>
#include <concepts>

template <class Type>
class Test {};

concept IsTestClass = requires(T v) {
  []<class T>(Test<T>) {}(v);
};

int main()
{
  std::cout << IsTestClass<int> << std::endl; // 0
  std::cout << IsTestClass<Test<int>> << std::endl; // 1
}

おしまい