2013-02-22 88 views
3

我想生成一个测试用例,它声明虚拟方法满足所有子类的某些属性。我如何自动执行此操作?如何遍历C++类的所有子类(在编译时)?

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); 
} 

是,即使升压/模板元编程/宏魔术可能的,还是我做出巨大的这里的推理错误?

+0

也许你可以砍了注册在推动融合的一切东西,但没有任何一种先前登记的,这是不可能的。 – PlasmaHH 2013-02-22 15:59:56

回答

2

这是不可能做到的。考虑一下当你编译你想要的代码时,扩展给定基的类集可能是未知的。尤其是,没有什么能够阻止您或任何其他开发人员在您的翻译单元编译完成后添加新类,并且现在您的整个项目的翻译和“编译时间”的“编译时间”将会不同。

更好的问题是什么你真的想解决?

+0

我希望为了更好的测试覆盖率,**任何**子类可以自动找到并产生测试用例(如果有人子类A ,实现foo()并忘记测试它)。 所以应该避免手动添加它,但每个子类自动注册自己的地方将是一个选项。 – user1101674 2013-02-22 16:07:25

0

我认为可行的解决方案可能是编写一个脚本(例如在python中)来扫描您的目录并为您生成带有测试用例的C++源代码。我不认为有一种方法可以在C++中实现它(不使用可以由特定编译器/平台提供的非标准扩展)。