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{};
),但显然这不是一个完美的解决方案。
有时候我们甚至不需要从由宏生成的类中获取任何成员, 但该类必须包含成员以提供一些函数(例如使用一些帮助类模板的
static_assert
)。嵌套类模板的完全特化是不允许的,这阻止了我使用嵌套类来避免上述第二点中提到的命名空间冲突。
我知道这在当前是非法的,但是为什么C++标准不允许呢?
MyClass
内扩展MACRO_GEN_FEATURE
? - Angew is no longer proud of SO