请考虑以下代码。我假设通过指定强类型枚举的类型,我将能够使用它传递给相同类型的函数和模板,因为指定的底层类型是相同的;虽然编译器抱怨缺少对该类型的强制转换。在下面的代码中,删除关键字class
并将Test::TOTAL_ITEMS
的枚举上的说明符返回到TOTAL_ITEMS
即可。我知道他们不想要强类型枚举的任何类型转换,但是当底层类型与函数或模板预期接收的类型相同时,我希望编译器不要抱怨这个和不强迫特定演员。想法?
#include <iostream>
#include <cstdint>
template <typename T, std::size_t N = 10>
class Y {
public:
Y() : z_() {
}
~Y() = default;
private:
T z_[N];
};
class X {
public:
enum class Test : std::size_t {
ITEM1 = 0,
ITEM2,
TOTAL_ITEMS,
};
private:
Y<int, Test::TOTAL_ITEMS> collection;
};
int main() {
X xx;
}
答案 0 :(得分:3)
作用域枚举的全部目的是防止对底层类型的隐式转换。您需要将其转换为编译代码
#include <type_traits>
Y<int, static_cast<std::underlying_type<Test>::type>(Test::TOTAL_ITEMS)> collection;
或者,如果您只关心为枚举指定基础类型,则从其定义中删除class
关键字,您的代码将按原样编译。
enum Test : std::size_t {
// ...
};
答案 1 :(得分:0)
enum class
的目的是使其实例不会隐式转换为其他类型。这就是删除class
编译的原因:常规enum
实例隐式地转换为其基础类型可以的任何内容。
如果您想将enum class
转换为其他类型,则必须明确 :
enum class Foo : int { FEE, FYE, FOE, FUM };
void f(Foo x) {};
void g(int x) {};
int main()
{
f(Foo::FEE); // Okay: correct type
//f(0); // Error: no implicit conversion
f(static_cast<Foo>(0)); // Okay: explicitly converted
//g(Foo::FYE); // Error: no implicit conversion
g(1); // Okay: correct type
g(static_cast<int>(Foo::FYE)); // Okay: explicitly converted
}
Live demo。如果您希望以编程方式提取类型,请参阅std::underlying_type
。