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
は任意の型が特定の型と同じかどうかを表します。
当然、任意の型が特定のクラステンプレートと同じかどうかを判定するのには使えません。
材料
ジェネリックラムダのテンプレート構文
実装
#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 }
おしまい