C++ 强类型枚举不允许用作相同基础类型的参数?
考虑以下代码。我假设通过指定强类型枚举的类型,我将能够使用它传递给相同类型的函数和模板,因为指定的底层类型是相同的;尽管编译器抱怨类型转换丢失。在下面的代码中,删除关键字C++ 强类型枚举不允许用作相同基础类型的参数?,c++,c++11,enums,strongly-typed-enum,C++,C++11,Enums,Strongly Typed Enum,考虑以下代码。我假设通过指定强类型枚举的类型,我将能够使用它传递给相同类型的函数和模板,因为指定的底层类型是相同的;尽管编译器抱怨类型转换丢失。在下面的代码中,删除关键字class和Test::TOTAL_ITEMS的枚举上的说明符回到TOTAL_ITEMS将起作用。我知道他们不希望强类型枚举进行任何类型转换,但当底层类型与函数或模板预期接收的类型相同时,我希望编译器不会对此抱怨,也不会强制执行特定强制转换。想法 #include <iostream> #include <cs
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;
}
#包括
#包括
模板
Y类{
公众:
Y():z_40;){
}
~Y()=默认值;
私人:
T z_[N];
};
X类{
公众:
枚举类测试:std::size\u t{
第1项=0,
项目2,
项目总数,
};
私人:
Y收集;
};
int main(){
X xx;
}
枚举类的目的是防止其实例隐式转换为其他类型。这就是为什么删除class
会编译:常规enum
实例隐式转换为其基础类型可以转换的任何对象
如果要将枚举类
转换为其他类型,必须明确执行以下操作:
enum类Foo:int{FEE,FYE,FOE,FUM};
void f(Foo x){};
void g(int x){};
int main()
{
f(Foo::FEE);//好的:正确的类型
//f(0);//错误:没有隐式转换
f(static_cast(0));//好的:显式转换
//g(Foo::FYE);//错误:没有隐式转换
g(1);//好的:正确的类型
g(static_cast(Foo::FYE));//好的:显式转换
}
。有关何时以编程方式提取类型的信息,请参阅。作用域枚举的全部目的是防止隐式转换为基础类型。您需要强制转换它,以使代码得以编译
#include <type_traits>
Y<int, static_cast<std::underlying_type<Test>::type>(Test::TOTAL_ITEMS)> collection;
是的,这就是我最后要做的。谢谢你的解释
#include <type_traits>
Y<int, static_cast<std::underlying_type<Test>::type>(Test::TOTAL_ITEMS)> collection;
enum Test : std::size_t {
// ...
};