SFINAEとか使えないのが痛すぎる。
■現下の実装
template <typename T> struct is_primitive { enum { value = 0 }; };
template <> struct is_primitive<void> { enum { value = 1 }; };
template <> struct is_primitive<bool> { enum { value = 1 }; };
template <> struct is_primitive<int> { enum { value = 1 }; };
template <> struct is_primitive<unsigned int> { enum { value = 1 }; };
template <> struct is_primitive<char> { enum { value = 1 }; };
template <> struct is_primitive<signed char> { enum { value = 1 }; };
template <> struct is_primitive<unsigned char> { enum { value = 1 }; };
template <> struct is_primitive<short> { enum { value = 1 }; };
template <> struct is_primitive<unsigned short> { enum { value = 1 }; };
template <> struct is_primitive<long> { enum { value = 1 }; };
template <> struct is_primitive<unsigned long> { enum { value = 1 }; };
template <> struct is_primitive<float> { enum { value = 1 }; };
template <> struct is_primitive<double> { enum { value = 1 }; };
typedef char yes_type;
struct no_type { char dummy[8]; };
yes_type enum_check(int);
no_type enum_check(...);
template <typename T>
struct is_enum_impl
{
enum
{
value1 = (sizeof(yes_type) == sizeof(enum_check(*((T*)0)))),
value2 = !is_primitive<T>::value,
value3 = value1 && value2
};
};
template <typename T>
struct is_enum
{
enum
{
value = is_enum_impl<T>::value3
};
};
■出る警告warning: cannot pass objects of type `(構造体/クラス名)' through `...'■ダメな実装
(1) template <typename T> no_type check(T*, void (T::*)() = 0); (2) yes_type check(...);とか書くと、enumの型で(1)が適用される。
0 件のコメント:
コメントを投稿