如果传递给模板的类型是枚举类型,如何检查(没有Boost或其他非标准的lib)? 感谢。
答案 0 :(得分:2)
我感谢你想要完全可移植性而不是使用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>
就是这样。