Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将枚举转换为字符串_C++_Boost_Enums_Key Value - Fatal编程技术网

C++ 将枚举转换为字符串

C++ 将枚举转换为字符串,c++,boost,enums,key-value,C++,Boost,Enums,Key Value,我试图构建一个函数,将一个项从枚举转换为相应的字符串。我使用的枚举相当长,所以我不想使用开关大小写。我发现使用boost::unordered_映射的方法非常方便,但我不知道如何进行默认返回(当没有与枚举匹配的项时) 我甚至尝试了一些非常错误的事情: std::string convert(enum_type entry) { try{ return enumToString.at(entry); } catch(...){ return

我试图构建一个函数,将一个项从枚举转换为相应的字符串。我使用的枚举相当长,所以我不想使用开关大小写。我发现使用boost::unordered_映射的方法非常方便,但我不知道如何进行默认返回(当没有与枚举匹配的项时)

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

std::string convert(enum_type entry)
{
    try{
        return enumToString.at(entry);
    }
    catch(...){
        return "invalid_value";
    }
}
结果:错误的“调试”运行时错误。 谁能给我一个建议,告诉我如何 1) 找到一种更简单的方法将枚举转换为与枚举项同名的字符串
2) 找到一种使用已构建的boost方法从哈希映射(最佳选项)获取默认值的方法
3) 查找要在测试中放置的内容,以使用返回键值对的函数,或者如果在映射中找不到键值,则返回其他字符串的函数。

非常感谢。

有关转换例程:

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;
}
std::string
转换(枚举类型项)
{
boost::无序映射::常量迭代器
retval=enumToString.find();
return retval==enumToString.end()
?“无效的_值”
:retval->second;
}

请注意,如果枚举不包含赋值,则使用一个简单的
char const*[]
即可。

这不是对您的问题的明确回答,但我建议使用另一个数据结构:

使用双向映射,例如。g

BoST.bimap是C++的双向映射库。使用Boost.Bimap,您可以创建关联容器,其中两种类型都可以用作键。

bimap
可以看作是
std::map
std::map
的组合

使用双向映射(您还可以使用两个
std::无序_-map
实例实现基本映射),您可以:

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

如果将检索方法封装在模板类中,则可以最大限度地减少干燥。例如。您可以通过
std::pair
实例将枚举数/std::string关联传递给需要一个
std::initializer_list
参数的构造函数。

auto-retval=enumToString.find()
@jpm:是的,但这应该是默认值。每个主要的编译器都有这个功能已经3年多了,现在已经是标准了。@MooingDuck它在我通常使用的编译器中不存在,至少在我们通常使用的选项中不存在。事实上,能够使用C++11功能的人还是相当少的。谢谢,我试图使用此方法,但遇到错误:“初始化”:无法从“boost::unordered_detail::hash_const_迭代器”转换为“boost::unordered_detail::hash_const_迭代器”“binary”“=”:未找到接受类型为“boost::unordered_detail::hash_const_迭代器”的左操作数的运算符(或没有可接受的转换)@相反,有两种可能。第一个是简单地使用第二个映射:
std::unordered\u map
。或者:使用
struct{enum_type,char const*}
的C样式数组,而不是
unordered_map
,对必须获取另一个元素的元素进行线性搜索。对于少于15或20个元素的枚举,这可能比无序映射更快,而且它提供了完全静态初始化,这意味着您可以在静态对象的构造函数中使用它,而无需担心初始化顺序。开关将代码更少、速度更快、占用内存更少、更容易。你为什么这样做又慢又硬?看这里类似的问题:@MooingDuck你说得很有道理。我想知道为什么我在编写代码生成器时没有想到使用开关。(当然,如果
enum
中没有赋值,一个简单的
char const*[]
可能比一个开关快。)我正在寻找更大的灵活性——尽管如果没有其他方法可以工作,我会使用一个开关——我希望有更多的内置方法,比如检查是否存在,可能还有一种反向查找的方法。我不知道它比开关箱慢?
std::string convert(enum_type entry)
{
    try{
        return enumToString.at(entry);
    }
    catch(...){
        return "invalid_value";
    }
}
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;
}