【问题标题】:Is there an interface mechanism for nested enum classes?嵌套枚举类是否有接口机制?
【发布时间】:2013-03-01 13:16:05
【问题描述】:

在 C++ 中,纯虚函数提供接口的功能。也就是说,任何子类必须实现基类中的所有纯虚函数:

class myClass {
    virtual bool implementme() = 0; // MUST be implemented
};

class mySubClass : public myClass {
    bool implementme() {} // REQUIRED
};

嵌套 (enum) classes 有类似的机制吗?也就是说,我正在寻找类似的东西

class myClass {
    virtual enum class myEnum = 0; // MUST be implemented
};

class mySubClass : public myClass {
    enum class myEnum {}; // REQUIRED
};

【问题讨论】:

  • 你想用这个完成什么?
  • @DarkFalcon:我想确保myClass所有 子类都有一个同名的enum。我还想确保没有“默认”枚举,就像您从(非虚拟)myClass 继承时那样。
  • @Rody - 代码可以编译吗?
  • @EdHeal: 不,显然不是 :) 同样简单的谷歌搜索也没有多大用处。
  • @RodyOldenhuis:我在问你为什么要这样做。我理解这个概念。我不明白为什么当您尝试引用不存在的名称时,除了通常的编译错误之外,您还需要其他机制来强制执行此操作。

标签: c++ oop class inheritance


【解决方案1】:

由于您说实现者不是您的代码库的一部分(因此不会产生编译错误),我必须假设您正在编写一个库,并且使用此枚举的代码在库的使用者中。

我建议您使用CRTP,如下所示:

class myClass {
};

template<typename T> class myClassImpl : public myClass {
  static_assert(std::is_enum<typename T::myEnum>::value, "Subclasses of myClassImpl must provide the myEnum enum class");
};

class mySubClass : public myClassImpl<mySubClass> {
    enum class myEnum {};
};

【讨论】:

    【解决方案2】:

    这没有多大意义。有人只能对基类(而不是派生类)有可见性,并从某个虚函数的返回中取回myEnum,其中myEnum 是不完整的类型。没有任何类型的虚拟类型的机制,包括枚举。你真的想要一个虚拟表来查找你的类型吗?

    【讨论】:

    • 我希望myClass 成为一个接口,这意味着它不能被实例化(每个人都可以看到至少一个派生类)。我还想确保myClass所有 子类都有一个同名的enum,它们确实没有 通过从myClass 继承获得。
    • @RodyOldenhuis 你搞错了什么是接口。这是非常常见的,事实上,完全是为了让你有一个指向接口的指针或引用,而对任何派生类不可见。
    • 不管我是否使用correct terminology,你知道有一种方法可以强制子类实现enum,而不会从基类中获得任何默认值吗?
    • @RodyOldenhuis 我的回答不是关于正确的术语。不管你有什么样的基类,你总是可以拥有一个没有派生类可见性的基类。你试图做的事情是不允许的。你基本上想要一个运行时推导类型。 C++ 不适合这种魔法,它是静态类型的。
    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2019-11-16
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多