yohhoyの日記

技術的メモをしていきたい日記

変数型のコンパイル時判定

プログラミング言語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_samestd::same_asとは挙動が微妙に異なることに注意。
メモC++2c(C++26)バージョンのtype_of(^^val)はリフレクション型std::meta::infoを実引数にとるため、ADLによってstd::meta::type_ofリフレクション・メタ関数が探索される。

関連URL