将任意数据传递给没有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

下一篇: Conversion from void* to the pointer of the base class