C++でクラスにタグのようなものを埋め込み,その存在の有無をコンパイル時に判定するためのメタ関数を実装したい.
#include <type_traits>
template<typename T, typename R=void>
struct enable_if_type {using type = R;};
template<typename T, typename R=void>
struct has_x_tag : std::false_type {};
template<typename T>
struct has_x_tag<T, typename enable_if_type<typename T::x_tag>::type>
: std::true_type {};
int main()
{
struct A {};
struct X {using x_tag = void;};
static_assert(has_x_tag<A>::value, ""); // fail
static_assert(has_x_tag<X>::value, ""); // pass
}
ポイントは2つ:
- タグは適当な型エイリアス
using x_tag = void
で定義 - 判定用メタ関数
has_x_tag<>
は SFINAE で実装
このアイデアは Stack Overflow にて @JoelFalcou 氏が提案した "Lightweight Type Categorization Idiom" を拝借したものです: