我有枚举类型,我为此重载了operator>>
。
std::istream& operator >>(std::istream &is,MyEnum& enumVar)
{
int intVal;
is>>intVal;
enumVar = intVal;
return is;
}
如何避免为所有未来的枚举类型编写此代码,即如何编写函数以使其适用于所有枚举类型?
答案 0 :(得分:4)
使操作符成为模板并仅在模板参数为枚举时启用它(使用enable_if
):
#include <type_traits>
template<typename T>
typename std::enable_if<std::is_enum<T>::value, std::istream&>::type
operator >>(std::istream &is, T& enumVar)
{
std::cout << "enum\n"; // just to see it is this one that gets used
int intVal;
is >> intVal;
enumVar = static_cast<T>(intVal); // note the explicit cast to make it legal
return is;
}
如果你没有C ++ 11,你可以使用boost的type_traits
库。
看到您的评论,您不确切知道enable_if
的工作原理,这里是link with a detailed explanation.
简而言之,enable_if
模板成对出现 - 当条件(第一个模板参数)为真时,一个成员typedef为第二个模板参数到type
,一个没有那个typedef,当条件为假。具有错误条件的模板实例化无效,因为成员typedef不存在。然后,这种实例化(而不是硬编译器错误)从过载集中丢弃以用于稍后的重载解析。另请阅读SFINAE。
enable_if
与标准版的工作方式略有不同。使用:
boost::enable_if < boost::is_enum<T>, std::istream& >::type
// ^^^^^^^^^^^^^^^^^
// expects a type
或
boost::enable_if_c < boost::is_enum<T>::value, std::istream& >::type
// ^^^^^^^^^^^^^^^^^^^^^^^^
// expects a value