template <typename T>
struct is_enum_check
{
is_enum_check(T const&);
static yes_type check(int);
static no_type check(is_enum_check const&);
};
template <typename T>
struct is_enum_impl
{
enum
{
value1 = (sizeof(yes_type) == sizeof(is_enum_check<T>::check(*((T*)0)))),
value2 = !is_primitive<T>::value,
value3 = value1 && value2
};
};
template <typename T>
struct is_enum
{
enum
{
value = is_enum_impl<T>::value3
};
};
肝はis_enum_checkのコンストラクタでexplicitにしないことと、このオブジェクトアダプタをis_enum_checkと別体にしないこと。別体にすると不可思議なコンパイルエラーになった。
0 件のコメント:
コメントを投稿