迭代“map”,其值为“enum”

时间:2014-06-14 17:52:09

标签: c++ c++11 map stl enums

我有一张地图:map<string, Operations>其中,操作是一个枚举

enum class Operations 
{
    div,
    mul,
    add,
    sub
 };

我这样填写地图:

myMap.insert( make_pair("add", Operations::add) );
myMap.insert( make_pair("sub", Operations::sub) );
myMap.insert( make_pair("div", Operations::div) );
myMap.insert( make_pair("mul", Operations::mul) );

如何正确迭代此地图?特别是得到第二个元素?,(值)。 我收到编译错误。

以下是代码:

#include <iostream>
#include <map>

using namespace std;

enum class Operations
{
    add,
    sub,
    div,
    mul
};

template <class K, class V>
void displayMap ( map<K,V> &m )
{
    typename map<K,V>::iterator inx = m.begin();
    for ( ;inx != m.end(); ++inx )
    {
        cout << inx-> first << " " << inx->second << endl;
    }
}


int main ( )
{

    static map<string, Operations> myMap;

    myMap.insert( make_pair ("add", Operations::add) );
    myMap.insert( make_pair ("sub", Operations::sub) );
    myMap.insert( make_pair ("div", Operations::div) );
    myMap.insert( make_pair ("mul", Operations::mul) );

    displayMap (myMap);

    return 0;
}

以下是错误消息:

error: invalid operands to binary expression ('basic_ostream<char,
  std::__1::char_traits<char> >' and 'Operations')
        cout << inx-> first << " " << inx->second << endl;

提前致谢! LEO

2 个答案:

答案 0 :(得分:4)

您使用的是作用域枚举,它不允许对基础类型进行隐式转换。这是C ++ 11添加它们的重点。您必须将它们显式地转换为基础类型。

#include <type_traits>

cout << inx-> first 
     << " " 
     << static_cast<typename std::underlying_type<V>::type>(inx->second) 
     << endl;

Live demo


另一方面,如果要显示枚举器值以外的内容,可以创建operator<<重载来打印任何内容。

std::ostream& operator<<(ostream& os, Operations op)
{
    switch(op)
    {
        case Operations::add:
            return os << '+';
        case Operations::sub:
            return os << '-';
        case Operations::div:
            return os << '/';
        case Operations::mul:
            return os << '*';
        default: throw std::runtime_error("illegal Operation");
    }
}

Live demo

答案 1 :(得分:1)

问题是Operations无法打印std::ostream,因为没有operator<<重载(并且Operations无法隐式转换为其基础类型)

您可以按如下方式实施:

std::ostream& operator<<(std::ostream& os, Operations op)
{
    switch (op)
    {
        case Operations::div: return os << "div";
        case Operations::mul: return os << "mul";
        case Operations::add: return os << "add";
        case Operations::sub: return os << "sub";
        // (omit default case to enable compiler warning for missing case)
    }
}

(另请注意,必须在定义Operator的同一名称空间中定义此重载。)