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)
这里没有隐式转换。来自枚举:
尽管可以使用 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)