如何迭代C++类的所有子类(在编译时)

How can I iterate over all subclasses of a C++ class (at compile time)?

本文关键字:子类 编译 何迭代 迭代 C++      更新时间:2023-10-16

我想生成一个测试用例,断言虚拟方法满足所有子类的某些属性。如何实现自动化?

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输出的人。