检查类型是否为枚举的方法

时间:2010-09-15 19:06:40

标签: c++ templates

如果传递给模板的类型是枚举类型,如何检查(没有Boost或其他非标准的lib)? 感谢。

2 个答案:

答案 0 :(得分:2)

http://www.boost.org/doc/libs/1_44_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html

我感谢你想要完全可移植性而不是使用boost。如果您发现不切实际,您可能仍然更喜欢使用简单的ifdef和以下内容: MSDN在c++ is_enum的Google搜索结果首页上有类似功能。 在最近的GNU编译器上,请试试using std::tr1::is_enum;

即使您不想使用增强功能,也可以检查确定中使用的技术。看起来足够复杂,可以排除所有其他可能性: - /。

答案 1 :(得分:2)

查看http://www.boost.org/doc/libs/1_44_0/boost/type_traits/is_enum.hpp

如果评估为true

::boost::type_traits::ice_or<
           ::boost::is_arithmetic<T>::value
         , ::boost::is_reference<T>::value
         , ::boost::is_function<T>::value
         , is_class_or_union<T>::value
         , is_array<T>::value
      >::value

然后选择此基本模板:

// Don't evaluate convertibility to int_convertible unless the type
// is non-arithmetic. This suppresses warnings with GCC.
template <bool is_typename_arithmetic_or_reference = true>
struct is_enum_helper
{
    template <typename T> struct type
    {
        BOOST_STATIC_CONSTANT(bool, value = false);
    };
};

否则请检查它是否可转换为int

template <>
struct is_enum_helper<false>
{
    template <typename T> struct type
       : ::boost::is_convertible<typename boost::add_reference<T>::type,::boost::detail::int_convertible>
    {
    };
};

如果你想和Boost一样做,你必须定义所有其他特征。 <type_traits>就是这样。