将 std::get 与枚举 class 一起使用时需要 static_cast
static_cast required when using std::get with enum class
根据c++ reference,std::get
的模板参数是一个std::size_t
。当这样的参数是具有基本类型 std::size_t
的 enum class
而不是隐式转换时,为什么需要显式转换?
看下面的例子
#include <tuple>
enum class labels : std::size_t { red, green, blue };
int main()
{
std::tuple<int, int, double> a;
// std::get<labels::red>(a) = 0;
std::get<static_cast<std::size_t>(labels::red)>(a) = 0;
std::get<static_cast<std::size_t>(labels::green)>(a) = 0;
std::get<static_cast<std::size_t>(labels::blue)>(a) = 0;
return 0;
}
取消注释该行会导致编译错误 (gcc 7.3.0)
tuple.cpp:8:26: error: could not convert template argument ‘red’ from ‘labels’ to ‘long unsigned int’
std::get<labels::red>(a) = 0;
那是因为 enum class
(相对于简单的 enum
)不能隐式转换为数字类型。您需要显式转换它以获得数值,例如使用 static_cast<>()
.
根据c++ reference,std::get
的模板参数是一个std::size_t
。当这样的参数是具有基本类型 std::size_t
的 enum class
而不是隐式转换时,为什么需要显式转换?
看下面的例子
#include <tuple>
enum class labels : std::size_t { red, green, blue };
int main()
{
std::tuple<int, int, double> a;
// std::get<labels::red>(a) = 0;
std::get<static_cast<std::size_t>(labels::red)>(a) = 0;
std::get<static_cast<std::size_t>(labels::green)>(a) = 0;
std::get<static_cast<std::size_t>(labels::blue)>(a) = 0;
return 0;
}
取消注释该行会导致编译错误 (gcc 7.3.0)
tuple.cpp:8:26: error: could not convert template argument ‘red’ from ‘labels’ to ‘long unsigned int’
std::get<labels::red>(a) = 0;
那是因为 enum class
(相对于简单的 enum
)不能隐式转换为数字类型。您需要显式转换它以获得数值,例如使用 static_cast<>()
.