【问题标题】:how to ouput a variable's name and value in type of 'enum class'?如何以“枚举类”类型输出变量的名称和值?
【发布时间】:2021-10-27 05:04:55
【问题描述】:
enum class A
{
    type_a,
    type_b
};
#define name(a) #a

int main()
{
    cout << name(A::type_a) << endl;
}

我可以像上面一样输出'enum class'变量'name(输出'A::type_a',因为它比它的值更容易理解)。但是如果我把输出放在一个函数中并使用'A: :type_a' 作为它的输入变量,如下所示,'enum class' 变量'name 将只输出输入变量的名称(输出'a' 而不是'A::type_a')。

void func(A a)
{
    cout << name(a) << endl;
}

int main()
{
    func(A::type_a);
}

虽然我可以使用“switch case”来列出枚举的每个名称,但是有没有更好的方法可以让我在添加或删除枚举中的任何项目时也不会修改输出函数。

【问题讨论】:

  • 您的宏只返回作为字符串输入的任何内容。如果你写name(asdf),它只会返回asdf
  • C++ 没有type introspection。如果不将枚举实际映射到代码中的字符串,就不可能做你想做的事。
  • 你可以使用下面的某种hack代码 switch(a) { case type_a: cout
  • @soumyasambitKunda 但是当我添加或删除枚举中的任何项目时,我必须同时更改“切换”代码。很不方便也很容易出错
  • @f1msch 问题是你为什么要首先这样做。

标签: c++ enums


【解决方案1】:

这需要反射的语言支持,因此目前在标准中是不可能的。

不过可以使用Magic Enum等第三方库来获取枚举的变量名:

#include <iostream>
#include <magic_enum.hpp>

enum class A
{
  type_a,
  type_b
};

template<class E>
void func(E e)
{
  std::cout << "enum name: " << magic_enum::enum_name(e) << "\n";
}

int main()
{
  func(A::type_a);
}

Demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多