std::get using enum class as template argument(std::get 使用枚举类作为模板参数)
问题描述
我正在使用 std::tuple
并定义了一个类枚举以某种方式命名"元组的每个字段,而忘记了它们的实际索引.
I'm using a std::tuple
and defined a class enum to somehow "naming" each of the tuple's fields, forgetting about their actual indexes.
所以不要这样做:
我是这样做的:
问题是,由于这是使用 gcc 4.5.2 编译的,我现在已经安装了 4.6.1 版本,但我的项目无法编译.此代码段重现了错误:
The problem is that, as this compiled using gcc 4.5.2, I've now installed the 4.6.1 version, and my project failed to compile. This snippet reproduces the error:
该错误基本上是说没有与我对 std::get
的调用相匹配的重载:
The error basically says that there's no overload that matches my call to std::get
:
那么,有什么方法可以将我的枚举类用作 std::get
的模板参数?这是不是编译的东西,并在 gcc 4.6 中修复了?我可以使用简单的枚举,但我喜欢枚举类的作用域属性,所以如果可能的话,我更喜欢使用后者.
So, is there any way I can use my enum class as a template argument to std::get
? Was this something that wasn't ment to compile, and was fixed in gcc 4.6? I could use a simple enum, but I like the scoping properties of enum classes, so I'd prefer to use the latter if it's possible.
推荐答案
C++11 引入的强类型枚举不能隐式转换为 int
类型的整数值,而 std::get
期望模板参数是整型.
The strongly-typed enums introduced by C++11 cannot be implicitly converted into integral values of type say int
, while std::get
expects the template argument to be integral type.
您必须使用 static_cast
来转换枚举值:
You've to use static_cast
to convert the enum values:
或者您可以选择转换为底层整数类型为:
Or you can choose to convert into underlying integral type as:
然后将其用作:
这篇关于std::get 使用枚举类作为模板参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!