C++ 枚举类 std::size_t 隐式转换

suk*_*nej 6 c++ tuples std enum-class

我通过创建一个枚举类定义了一个元组及其索引:

/** parameter { key ; value1 ; value1 ; } */
using Parameter = std::tuple<unsigned, unsigned, unsigned>;
enum class ParameterKey : std::size_t {
    KEY = 0,
    VALUE1 = 1,
    VALUE2 = 2
};
Run Code Online (Sandbox Code Playgroud)

现在我想从这个元组中得到一个值:

const auto& key = std::get<ParameterKey::KEY>(*parameterPointer);
Run Code Online (Sandbox Code Playgroud)

我认为从intto的隐式转换std::size_t是由: std::size_t语法确保的:

enum class ParameterKey : std::size_t {
    ....
}
Run Code Online (Sandbox Code Playgroud)

但我收到了这个错误

error: no matching function for call to ‘get<KEY>(std::tuple<unsigned int, unsigned int, unsigned int>&)’
Run Code Online (Sandbox Code Playgroud)

这工作正常,但它太啰嗦了:

const auto& key = std::get<static_cast<unsigned>(ParameterKey::KEY)>(*parameterPointer);
Run Code Online (Sandbox Code Playgroud)

Edg*_*jān 5

这里没有隐式转换。来自枚举

尽管可以使用 static_cast 来获取枚举数的数值,但不存在从作用域枚举数的值到整型类型的隐式转换。

所以,你必须使用static_cast.


有一些基于 的解决方法static_cast。例如,人们可能会使用std::underlying_type

template<typename T>
constexpr auto get_idx(T value)
{
    return static_cast<std::underlying_type_t<T>>(value);
}
Run Code Online (Sandbox Code Playgroud)

进而:

const auto& key = std::get<get_idx(ParameterKey::KEY)>(*parameterPointer);
Run Code Online (Sandbox Code Playgroud)