为了使代码更具可读性,我对 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/