将任意数据传递给没有void指针的函数

时间:2012-05-15 22:20:03

标签: c++ parameter-passing void-pointers

我正在使用一个实现一组系统测试的抽象基类。简化形式,类声明是:

class Test_Class
{
    Test_Class();
    ~Test_Class();

    Run_Test(void * param_set = NULL) = 0;
}

基类需要实现Run_Test函数,该函数允许用户将任意数据结构作为void指针传入并将其转换为子类中Run_Test体内的相应类型,以允许不同测试使用不同的数据结构,例如一个测试中的浮点数与另一个测试中的一个列表。

这很麻烦,看起来像是一种令人难以置信的C式做事方式。有没有更好的方法来使用继承或其他语言实用程序?

注意:由于客户限制,此程序不允许访问STL或Boost库。

3 个答案:

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