是否有一种模式可以从C++中的另一个枚举继承枚举?
像这样的东西:
enum eBase { one=1, two, three }; enum eDerived: public eBase { four=4, five, six };
Mykola Golub.. 90
#include#include class Enum { public: enum { One = 1, Two, Last }; }; class EnumDeriv : public Enum { public: enum { Three = Enum::Last, Four, Five }; }; int main() { std::cout << EnumDeriv::One << std::endl; std::cout << EnumDeriv::Four << std::endl; return 0; }
这不行.当你定义一些函数`int basic(EnumBase b){return b; }`和`int derived(EnumDeriv d){return d; 这些类型不能转换为`int`,尽管普通的枚举是.当你尝试这样简单的代码时:`cout << basic(EnumBase :: One)<< endl;`,然后你会得到一个错误:`从'EnumBase ::
Brian R. Bon.. 62
不可能.枚举没有继承.
您可以使用具有命名const int的类.
例:
class Colors { public: static const int RED = 1; static const int GREEN = 2; }; class RGB : public Colors { static const int BLUE = 10; }; class FourColors : public Colors { public: static const int ORANGE = 100; static const int PURPLE = 101; };
Kirill V. Ly.. 10
你不能做到这一点直接,但你可以尝试使用的解决方案,从这个文章.
主要思想是使用包含枚举值的helper模板类,并具有类型转换操作符.考虑到枚举的基础类型,int
您可以在代码中无缝地使用此持有者类而不是枚举.
#include#include class Enum { public: enum { One = 1, Two, Last }; }; class EnumDeriv : public Enum { public: enum { Three = Enum::Last, Four, Five }; }; int main() { std::cout << EnumDeriv::One << std::endl; std::cout << EnumDeriv::Four << std::endl; return 0; }
不可能.枚举没有继承.
您可以使用具有命名const int的类.
例:
class Colors { public: static const int RED = 1; static const int GREEN = 2; }; class RGB : public Colors { static const int BLUE = 10; }; class FourColors : public Colors { public: static const int ORANGE = 100; static const int PURPLE = 101; };
你不能做到这一点直接,但你可以尝试使用的解决方案,从这个文章.
主要思想是使用包含枚举值的helper模板类,并具有类型转换操作符.考虑到枚举的基础类型,int
您可以在代码中无缝地使用此持有者类而不是枚举.
不幸的是,在C++ 14中是不可能的.我希望我们在C++ 17中有这样的语言功能.由于您已经为您的问题找到了一些解决方法,因此我不会提供解决方案.
我想指出,措辞应该是"延伸"而不是"继承".扩展允许更多的值(在您的示例中,您从3跳到6个值),而继承意味着将更多约束放到给定的基类中,因此可能性会缩小.因此,潜在的铸造将与继承完全相反.您可以将派生类强制转换为基类,而不是反过来继承类继承.但是当有扩展时,你"应该"能够将基类强制转换为扩展而不是反之.我说"应该"因为,正如我所说,这样的语言功能仍然不存在.