将任意数据传递给没有void指针的函数
我正在使用抽象基类实现一组系统测试。 以简化的形式,类声明是:
class Test_Class
{
Test_Class();
~Test_Class();
Run_Test(void * param_set = NULL) = 0;
}
基类需要实现Run_Test函数,该函数允许用户将任意数据结构作为void指针传递并将其转换为子类中的Run_Test主体内的适当类型,以便允许使用不同的测试不同的数据结构,例如一次测试中的浮点数与另一次测试中的整数列表。
这很麻烦,看起来像一个非常类似C的做事方式。 有更好的方法来使用继承或其他语言工具吗?
注意:由于客户的限制,该程序不允许访问STL或Boost库。
是。 用户不会传递任意数据结构,但可以通过扩展基类来构建任意数据结构。
class Test_Class {
Run_Test(const Config& config);
};
客户代码:
class MyConfig : public Config {
//...
};
另一个选择是模板。 你可以用两种方法完成许多常见任务,我不确定哪种情况在这种情况下是理想的,所以我会把它留给其他答案或者给你研究一下,如果你走这条路。
如果你想要一组测试,使用std::vector<std::function<void()>> tests;
然后你可以简单地通过tests.push_back([=] { do_test(the_args, I_captured, from_local, scope); });
。
如果你的编译器不支持lambdas,你可以用std::bind
做类似的技巧。
最终用户不需要编写自己的通用功能接口。 它已经完成了。
编辑:是的,如果你没有A)重新实现由Boost或STL提供的轮子或B)使用由Boost或STL提供的现有轮子,你将最终得到一些C风格的垃圾。 在“编写自己的好代码”或“使用其他人的好代码”之间没有不可思议的第三选择,这仍然导致代码良好。
我不记得是否有可能/如何在类内部对函数进行参数检测,所以也许会这样做:
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);
}
链接地址: http://www.djcxy.com/p/43839.html
上一篇: Passing arbitrary data to a function without void pointers