2013年12月26日木曜日

is_enum改良版

gcc2.7.2でis_enumを作る取り込み・・・一応改良版ができた。

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 件のコメント:

コメントを投稿