将枚举类变量名解析为字符串



考虑,我有以下enum类:

enum class TestEnum
{
None = 0,
Foo,
Bar
};

我想为这个enum类指定ostream operator ( << ),所以我可以写:

std::cout << "This is " << TestEnum::Foo;

,得到如下输出This is Foo

我的问题是:
是否有任何地方enum名称说明符&;存储?(即对于enum classTestEnum,它是None,FooBar)所以我可以写一个函数(或最好的函数模板),为这个TestEnum指定ostream操作符,如:

std::ostream& operator<< ( std::ostream& os, TestEnum aEnum ) {
return std::string( aEnum.name() );
}
到目前为止,我是这样做的:
std::ostream& operator<< ( std::ostream& os, TestEnum aEnum ) {
switch( aEnum )
{
case TestEnum::Foo:
os << "Foo";
break;
case TestEnum::Bar:
os << "Bar"
break;
}
return os;
}

我已经看到了一些使用boost库的解决方案,但我不希望这次使用它。

是否存在enum "名称说明"存储?

不,但一个选择是使用std::map<TestEnum, std::string>,如下所示:

enum class TestEnum
{
None = 0,
Foo,
Bar
};
const std::map<TestEnum,std::string> myMap{{TestEnum::None, "None"}, 
{TestEnum::Foo, "Foo"}, 
{TestEnum::Bar, "Bar"}};

std::ostream& operator<< ( std::ostream& os, TestEnum aEnum )
{
os << myMap.at(aEnum);
return os;
}
int main()
{
std::cout << "This is " << TestEnum::Foo; //prints This is Foo 
std::cout << "This is " << TestEnum::Bar; //prints This is Bar
return 0;
}

演示

是否存在enum名称说明符"存储?

不,名字不会保存在任何地方。如果需要,需要(不幸的是)对它们进行映射。

如果enum值可以用于数组索引(如OP的情况),则可以使用std::string_view数组进行映射(需要c++17或更高版本,否则为std::string数组)。

数组的使用,使得下面的解决方案轻量级和查找0(1)。

#include <iostream>
#include <string_view>
#include <type_traits> // std::underlying_type_t
using namespace std::string_view_literals;
enum struct TestEnum { None = 0,   Foo,   Bar };
inline static constexpr std::string_view enumArray[]{"None"sv, "Foo"sv, "Bar"sv};
std::ostream& operator<< (std::ostream& os, TestEnum aEnum)
{
return os << enumArray[static_cast<std::underlying_type_t<TestEnum>>(aEnum)];
}
int main()
{
std::cout << "This is " << TestEnum::Foo; // prints: "This is Foo" 
std::cout << "This is " << TestEnum::Bar; // prints: "This is Bar"
}

查看演示

最新更新