yohhoyの日記

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

クラステンプレート特殊化型判定 @ C++26

プログラミング言語C++において、与えられた型があるクラステンプレートの特殊化(specialization)か否かを判定する方法。id:yohhoy:20220122C++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