プログラミング言語C++において、与えられた型があるクラステンプレートの特殊化(specialization)か否かを判定する方法。id:yohhoy:20220122のC++2c(C++26) Reflection(→id:yohhoy:20250305)バージョン。自明な実装で面白みはない...
// C++2c(C++26) #include <atomic> #include <array> #include <complex> #include <meta> // rはプライマリテンプレートprimaryの特殊化? consteval bool is_specialization_of(std::meta::info r, std::meta::info primary) { return std::meta::has_template_arguments(r) && std::meta::template_of(r) == primary; } consteval bool is_complex(std::meta::info r) { return is_specialization_of(r, ^^std::complex); } consteval bool is_stdarray(std::meta::info r) { return is_specialization_of(r, ^^std::array);} consteval bool is_atomic(std::meta::info r) { return is_specialization_of(r, ^^std::atomic); } static_assert( is_complex(^^std::complex<float>) ); static_assert( !is_complex(^^double) ); static_assert( is_stdarray(^^std::array<int, 5>) ); static_assert( !is_stdarray(^^int[5]) ); static_assert( is_atomic(^^std::atomic<int>) ); static_assert( !is_atomic(^^int) );
ノート:ADLを利用して単にhas_template_arguments(r)
, template_of(r)
とも記述できる。言語組込み配列型(T[N]
)を判定したい場合は、標準ヘッダ<meta>にてリフレクション・メタ関数std::meta::is_array_type(r)
が提供される。
関連URL