我正在使用一个实现一组系统测试的抽象基类。简化形式,类声明是:
class Test_Class
{
Test_Class();
~Test_Class();
Run_Test(void * param_set = NULL) = 0;
}
基类需要实现Run_Test函数,该函数允许用户将任意数据结构作为void指针传入并将其转换为子类中Run_Test体内的相应类型,以允许不同测试使用不同的数据结构,例如一个测试中的浮点数与另一个测试中的一个列表。
这很麻烦,看起来像是一种令人难以置信的C式做事方式。有没有更好的方法来使用继承或其他语言实用程序?
注意:由于客户限制,此程序不允许访问STL或Boost库。
答案 0 :(得分:1)
如果您想要一组测试,请使用std::vector<std::function<void()>> tests;
,然后您只需tests.push_back([=] { do_test(the_args, I_captured, from_local, scope); });
。
如果你的编译器不支持lambda,你可以用std::bind
做类似的技巧。
最终用户无需编写自己的通用功能接口。它已经完成了。
编辑:是的,如果不这样做,你将会得到一些C型垃圾A)重新实施Boost或STL提供的轮子或B)使用Boost或STL提供的现有轮子。在“编写自己的好代码”或“使用其他人的优秀代码”之间没有神奇的第三选择,这仍然会产生良好的代码。
答案 1 :(得分:1)
是。用户不会传递仲裁数据结构,但可以通过扩展基类来制作任意数据结构。
class Test_Class {
Run_Test(const Config& config);
};
客户代码:
class MyConfig : public Config {
//...
};
另一种选择是模板。你可以完成许多常见的任务,我不确定哪种情况在这种情况下是理想的,所以我会把它留给其他答案,或者你去研究一下,如果你走这条路。
答案 2 :(得分:0)
我不记得是否有可能/如何对类内部的函数进行参数检测,所以可能会这样做:
class Test_Class {
public:
template <typename T>
void Run_Test(T p) {
}
};
template <class T>
void tester(Test_Class t, T p) {
t.Run_Test<T>(p);
}
int main() {
Test_Class p;
int a = 5;
tester(p, a);
}