プログラミング言語C++において、コンパイル時にある変数の宣言型を判定する方法あれこれ。
2025-07-25追記:C++2c(C++26) Reflection(→id:yohhoy:20250305)利用バージョンを追加。
// 型名T と 変数名val // C++11以降 #include <type_traits> static_assert(std::is_same<T, decltype(val)>::value, ""); // C++17以降 #include <type_traits> static_assert(std::is_same_v<T, decltype(val)>); // C++20以降 #include <concepts> static_assert(std::same_as<T, decltype(val)>); // C++2b(C++23)以降 #include <typeinfo> static_assert(typeid(T) == typeid(val)); // C++2c(C++26)以降 #include <meta> static_assert(^^T == type_of(^^val));
ノート:C++2b(C++23)バージョンのtypeid演算子ではトップレベルのCV修飾と参照修飾が無視されるため(→id:yohhoy:20121122)、型情報の厳密一致を判定するstd::is_same
やstd::same_as
とは挙動が微妙に異なることに注意。
メモ:C++2c(C++26)バージョンのtype_of(^^val)
はリフレクション型std::meta::info
を実引数にとるため、ADLによってstd::meta::type_of
リフレクション・メタ関数が探索される。
関連URL