为什么我们不能为继承定义一个匿名类?

Why can't we define an anonymous class in place for inheritance?

本文关键字:一个 不能 我们 继承 定义 为什么      更新时间:2023-10-16
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)

附加:

问:为什么我不只在类中嵌入代码?

一个:1.此功能应明确并向用户公开。当他们生成文档时,派生类很容易被发现:class A: FEATURE1(A), FEATURE2(A)而嵌入的宏则不是。虽然可以导出一个空类来实现我们的目标(例如class A: FEATURE1(A)//just derive predefined struct FEATURE1_EMPTY{};(,但显然它不是一个完美的解决方案。

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

  2. 不允许嵌套类
  3. 模板的完全专用化,这使我无法使用嵌套类来避免 2( 中提到的命名空间冲突。

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

因为无论是Bjarne(在1980年代(还是ISO委员会(1990年代至今(的任何人都认为有必要这样做。在今天这个宏观黑客之前,我从未见过需要它。

以下是语言的开发方式:

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

以下是语言开发的方式:

  • 从每个可能的功能开始,以 ∞ 页长的标准
  • 不需要功能?删除它!
class MyClass : class { /* CONTENT */ } {
  // HERE
};

无论你把什么放在CONTENT的地方,都只能从类MyClass中使用甚至访问,所以它同样可以写在HERE的位置。

如果要"组织"单个类

的内容,可以使用"嵌套"类来增强封装:

class Thing {
  class SomeSubThing {} subthing;
};

尽管这是否有用甚至值得推荐在很大程度上取决于实际情况,并且可能非常主观。

相关文章: