将枚举转换为字符串

时间:2012-04-13 17:20:51

标签: c++ boost enums key-value

我正在尝试构建一个将项目从枚举转换为相应字符串的函数。我使用的枚举很长,所以我不想使用switch-case。我发现使用boost :: unordered_map的方法非常方便,但我不知道如何进行默认返回(当没有与枚举匹配的项目时)。

const boost::unordered_map<enum_type, const std::string> enumToString = boost::assign::map_list_of
(data_1, "data_1")
(data_2, "data_2");

我尝试创建一个额外的功能:

std::string convert(enum_type entry)
{
    if (enumToString.find(entry))       // not sure what test to place here, 
        return enumToString.at(entry);  //because the find method returns an iter
    else
        return "invalid_value";
}

我甚至尝试过一些非常错误的事情:

std::string convert(enum_type entry)
{
    try{
        return enumToString.at(entry);
    }
    catch(...){
        return "invalid_value";
    }
}

结果:恶意“调试”运行时错误。 有人可以给我一个关于如何任何一个的建议 1)找到一种更简单的方法将枚举转换为与枚举项目具有相同名称的字符串 2)找到一种方法来使用已经构建的boost方法从哈希映射中获取默认值(最佳选项)
3)找到测试中要放置的函数,以使用返回键值对的函数,或者如果在地图中找不到键,则返回不同的字符串。
非常感谢你。

2 个答案:

答案 0 :(得分:2)

对于转换例程:

std::string
convert( enum_type entry )
{
    boost::unordered_map<enum_type, std::string>::const_iterator
                        retval = enumToString.find();
    return retval == enumToString.end()
        ? "invalid_value"
        : retval->second;
}

请注意,如果枚举不包含指定的值,则只需一个简单的char const* []即可。

答案 1 :(得分:0)

这不是对您的问题的明确答案,但我建议使用其他数据结构:

使用双向地图,e。 G。 Boost.Bimap

  

Boost.Bimap是C ++的双向地图库。使用Boost.Bimap,您可以创建关联容器,其中两种类型都可以用作键。 bimap<X,Y>可以被视为std::map<X,Y>std::map<Y,X>的组合。

使用双向映射(您还可以实现具有两个std::unordered_map实例的基本映射),您可以:

  • 检索std::string
  • 的枚举器
  • 为枚举器检索std::string

如果将检索方法封装在模板类中,则可以最小化DRY。 E. g。您可以通过std::string实例将枚举器/ std::pair关联传递给期望一个std::initializer_list参数的构造函数。