如何迭代C++类的所有子类(在编译时)
How can I iterate over all subclasses of a C++ class (at compile time)?
我想生成一个测试用例,断言虚拟方法满足所有子类的某些属性。如何实现自动化?
class A {
virtual int foo() = 0;
};
class B : public A {
virtual int foo() override;
};
class C : public A {
virtual int foo() override;
};
我想做一些类似(我知道下面的语法是垃圾)的事情
for (A : SUBCLASSES_OF(A))
{
A a;
assert(a.foo() == 42);
}
这在boost/template元编程/宏魔术中是否可能,或者我在这里的推理中犯了一个巨大的错误?
观察器怎么样?请参见Vistor设计图案。同样,这个答案可能有助于访问者模式如何避免下行广播。
这是不可能的。考虑一下,在编译所需代码时,扩展给定基的类集可能是未知的。特别是,在编译完翻译单元后,没有什么可以阻止您或任何其他开发人员添加新的类,现在翻译的"编译时间"和整个项目的"编译时"将是不同的时间。
更好的问题是你真正想解决什么
我认为可行的解决方案可以是编写一个脚本(例如在python中),扫描您的目录并为您生成带有测试用例的C++源代码。我认为在c++本身中没有办法做到这一点(不使用特定编译器/平台提供的非标准扩展)。
会http://www.gccxml.org/HTML/Running.html帮助我知道一位同事几年前就用它来生成代码。
我也认识一些利用Doxygen的Xml输出的人。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 子类化 std::optional时编译错误
- 使用子类从std :: Pironity_queue获取容器时会编译错误
- 尝试引用子类中的抽象对象时收到编译错误
- 编译C++子类
- C++ 编译类的子类的时列表
- 为什么编译没有错误?(返回不对所述返回类型进行子类化的类型)
- 子类中的这种变化是否需要重新编译依赖于超类的代码?
- 为什么(false?A():B()).test()只有在A和B有子类关系时才能编译
- 使用-fno-rtti编译的共享库中的子类
- 如何迭代C++类的所有子类(在编译时)
- 很好地要求(不是编译时强制)子类创建者做某些事情