为什么我们不能在继承的地方定义匿名类?

4
class MyClass : SomeFeatureGeneratedByTemplate<MyClass>

通过继承一个实例化的类模板,可以为我们的类添加很多方便的功能。

然而,有时候这些功能可能会变得过于复杂,无法通过模板来实现,这时宏可能是唯一的选择。

    MACRO_TO_GENERATE_COMPLICATED_FEATURE(MyClass) 
   /* Might be expanded to 
    #ifndef MYCLASS_FEATURE_CLASS
    #define MYCLASS_FEATURE_CLASS
        class MyClassFeature { ... };
    #endif
   */
   class MyClass : MyClassFeature 

我想知道以下语法是否能简化这个问题: 允许在现场定义匿名类
class MyClass : class { ... }, class{ ... }

因此,上述代码可以重写为:
class MyClass : MACRO_GEN_FEATURE(MyClass)

追加:

Q:为什么我不能将代码直接嵌入类中?

A: 1. 这个特性应该是显式且暴露给用户的。当他们生成文档时,派生类很容易被发现:class A: FEATURE1(A), FEATURE2(A),而嵌入的宏则不是。虽然可以派生一个空类来实现我们的目标(例如:class A: FEATURE1(A)//just derive predefined struct FEATURE1_EMPTY{};),但显然这不是一个完美的解决方案。

  1. 有时候我们甚至不需要从由宏生成的类中获取任何成员, 但该类必须包含成员以提供一些函数(例如使用一些帮助类模板的static_assert)。

  2. 嵌套类模板的完全特化是不允许的,这阻止了我使用嵌套类来避免上述第二点中提到的命名空间冲突。

我知道这在当前是非法的,但是为什么C++标准不允许呢?


这样做的目的是什么?如果你想编写一个基类,就直接编写基类。 - Barry
在我看来,只有定义它的类才能从中继承,这使得它变得多余。 - Galik
为什么不允许?那应该为什么被允许呢? - Lightness Races in Orbit
什么阻止你直接在MyClass内扩展MACRO_GEN_FEATURE - Angew is no longer proud of SO
2个回答

5

因为Bjarne(在20世纪80年代)和ISO委员会的任何人(1990年代至今)都没有看到这方面的需求。直到今天的宏代码hackery,我才认为有必要。

以下是语言的开发方式:

  • 从零开始
  • 需要功能?添加!

以下是语言的不发展方式:

  • 以每个可能的功能开始,形成一个∞页长的标准
  • 不需要的功能?删除!

5
class MyClass : class { /* CONTENT */ } {
  // HERE
};

无论您将在CONTENT的位置放置什么,都只能从类MyClass使用或访问,因此可以在HERE所在的位置编写它。
如果您想“组织”单个类的内容,则可以使用“嵌套”类来增强封装性:
class Thing {
  class SomeSubThing {} subthing;
};

尽管这是否有用甚至值得推荐高度取决于实际情况,可能高度主观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接