c++ - std::get<0>(...) 和枚举索引

标签 c++ c++17 stdtuple

为了使代码更具可读性,我对 tuple 做了以下操作:

std::tuple<uint32_t, uint32_t, uint32_t> key;

enum  tpl {
    arg1 = 0, arg2 = 1, arg3 = 2
};

现在我可以写:

 auto _arg1 = std::get<tpl::arg1>(key);

我现在遇到一个问题。如果我写:

auto arg1 = std::get<tpl::arg1>(key);

变量 arg1 已经是枚举了。因此我想切换到:

enum class tpl: int {
    arg1 = 0, arg2 = 1, arg3 = 2
};

但是这里有些不对劲。编译器说:

error C2672: 'std::get': no matching overloaded function found

std::get 中的这个索引是什么类型,它可以在枚举类的定义中命名吗?

我试过了

const constexpr
const int 
....

最佳答案

作用域枚举(enum class)没有到任何类型整数的隐式转换。由于 std::get 需要整数类型的模板参数,因此必须进行此类转换。

但它不能,因此没有重载匹配提供的模板参数。

您可以使用在 C++11 之前使用的“作用域枚举”hack:

struct tpl {
  enum : int {
    arg1 = 0, arg2 = 1, arg3 = 2
  };
};

这使标识符具有作用域,但保留了隐式转换。引入 C++11 作用域枚举是因为隐式转换通常不是所需的功能,但在这种情况下我敢说它是。

关于c++ - std::get<0>(...) 和枚举索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443510/

相关文章:

c++ - 使用 C++ 和 directx 创建地形

android - java.lang.UnsatisfiedLinkError : dlopen failed: could not load library "libcrypto.so.1.0.0" needed by "libPrivateSsl.so"; 错误

c++ - 如何管理C++键盘事件?

c++ - 关于 cvFloodFill() 函数的 OpenCV 未处理异常

c++ - 内联静态数据的初始化

c++ - 当 const-ref 和 value 存在时,为什么转换运算符会导致不明确的重载

c++ - 为什么 `std::forward_as_tuple(1)` 不是常量表达式?

c++ - 通过模板检查是否存在带有参数列表的类成员函数?

c++ - 从元组向 std::map 插入值

c++ - 来自元组的构造函数参数