重载运算符>>适用于所有枚举类型

时间:2013-04-02 09:53:11

标签: c++ operator-overloading

我有枚举类型,我为此重载了operator>>

std::istream& operator >>(std::istream &is,MyEnum& enumVar)
{
  int intVal;
  is>>intVal;
  enumVar = intVal;
  return is;
}

如何避免为所有未来的枚举类型编写此代码,即如何编写函数以使其适用于所有枚举类型?

1 个答案:

答案 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

编辑:boost 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