为什么我们不能为继承定义一个匿名类?
Why can't we define an anonymous class in place for inheritance?
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{};
(,但显然它不是一个完美的解决方案。
有时我们甚至不需要从宏生成的类中获取任何成员,但该类必须包含 member 以提供一些函数(例如
static_assert
一些辅助类模板(。
不允许嵌套类模板的完全专用化,这使我无法使用嵌套类来避免 2( 中提到的命名空间冲突。
我知道现在这是非法的,但为什么这在C++标准中是不允许的呢?
因为无论是Bjarne(在1980年代(还是ISO委员会(1990年代至今(的任何人都认为有必要这样做。在今天这个宏观黑客之前,我从未见过需要它。
以下是语言的开发方式:
- 从零开始
- 需要功能吗?添加它!
以下是语言不开发的方式:
- 从每个可能的功能开始,以 ∞ 页长的标准
- 不需要功能?删除它!
class MyClass : class { /* CONTENT */ } {
// HERE
};
无论你把什么放在CONTENT
的地方,都只能从类MyClass
中使用甚至访问,所以它同样可以写在HERE
的位置。
的内容,可以使用"嵌套"类来增强封装:
class Thing {
class SomeSubThing {} subthing;
};
尽管这是否有用甚至值得推荐在很大程度上取决于实际情况,并且可能非常主观。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 不能将方法返回的值用于另一个方法
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 为什么一个简单的程序不能立即启动
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 为什么我不能创建一个 TSubclassOf<> 在 SpawnActor() 函数中使用?
- WINUSB_ControlTransfer只能在设备上可用的两个接口中的一个上使用,而不能在另一个接口上使用
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 不能 std::cout 一个max_element函数
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- RHEL 6.0两段相似的代码:一个能编译,一个不能
- 两个值的最大值,其中一个不能等于预定义值
- 如何创建一个不能被其他类继承的类
- 为什么c++编译器允许将一个不能为constexpr的函数声明为constexpr ?