用于将c++11枚举转换为基础类型的泛型函数,如果不是枚举,则返回自身

用于将c++11枚举转换为基础类型的泛型函数,如果不是枚举,则返回自身,c++11,enums,type-conversion,C++11,Enums,Type Conversion,正如标题所说,需要这样做是因为我正在将值序列化到std::ostringstream,并且不希望重载运算符您可以执行以下操作: template<typename E, typename = typename std::enable_if<std::is_enum<E>::value>::type> typename std::underlying_type<E>::type underlyer(E e) { return static_cast&

正如标题所说,需要这样做是因为我正在将值序列化到std::ostringstream,并且不希望重载运算符您可以执行以下操作:

template<typename E, typename = typename std::enable_if<std::is_enum<E>::value>::type>
typename std::underlying_type<E>::type
underlyer(E e)
{ return static_cast<typename std::underlying_type<E>::type>(e); }

template<typename E, typename = typename std::enable_if<!std::is_enum<E>::value>::type>
E
underlyer(E const& e)
{ return e; }
注意:这并不适用于所有情况;例如,如果您尝试underlyerHello,它将失败,因为您无法按值返回C数组。解决此问题的一种方法是让非枚举案例返回对传入参数的引用,但当同一函数在某些情况下返回值,而在其他情况下返回引用时,必须稍微小心