当前位置: 首页 > 知识库问答 >
问题:

将枚举类变量名解析为字符串[重复]

楚洋
2023-03-14

考虑一下,我得到了以下枚举类:

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

我想指定ostream操作符(

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

并获得以下输出,这是Foo。

我的问题是:
是否有存储枚举“名称说明符”的地方?(即,对于枚举类TestEnum,它是None、Foo和Bar),因此我可以编写一个函数(或者至多是函数模板)来指定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;
}

我见过一些使用boop库的解决方案,但这次我不希望使用它。

共有2个答案

史淳
2023-03-14

是否有任何存储枚举“名称说明符”的地方?

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

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

array的使用使以下解决方案变得轻量级和O(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"
}

查看演示

孔理
2023-03-14

是否有任何存储枚举“名称说明符”的地方?

不,但有一个选项是使用标准::映射

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;
}

演示

 类似资料:
  • 我有一个枚举文件,在其中我为PaymentTypes定义了一个对象: 这样我就有了可以使用的东西:

  • 我有一个枚举,我想让这些枚举类型在开关情况下成为字符串。 因此,在上面我硬编码“Mon”,而不是有一种方法,我们可以直接将枚举类型作为字符串。就目前而言,如果我在交换机案例中传递枚举类型,我将获得id 0、1或2,但我需要Mon/Tue/Wed作为字符串

  • 问题内容: 当用户登录时,我正在设置一个sessionScope对象,并且那个bean对象由几个其他bean组成。这些bean的属性之一是枚举,但是我发现EL无法获取enum类的属性,而只能获取Java bean对象的属性。因此,我决定为该枚举创建一个bean类,并将该枚举嵌套在该bean类中。我为替换枚举而制作的java bean,以便可以通过EL获得其值,如下所示: 但是,当我尝试访问等级名称

  • 在angular 12应用程序上,我有enum: 我尝试如下定义Policy类型的变量: < code>route.data.policy的类型是< code>any。但是我得到了错误: 元素隐式具有“任何”类型,因为索引表达式不是“数字”类型。 如何将route.data.policy的值解析为枚举的< code>'Admin'或< code>'Manager'?

  • 本文向大家介绍Java将枚举转换为字符串,包括了Java将枚举转换为字符串的使用技巧和注意事项,需要的朋友参考一下 示例 有时您想将枚举转换为String,有两种方法可以实现。 假设我们有: 那么,我们如何将类似的东西转换Fruit.APPLE为"APPLE"? 使用转换 name() name()是一个内部方法,enum该方法返回String枚举的表示形式,返回值精确String表示枚举值的定义

  • 例如,我如何做类似的事情: 结果示例: