0

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

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

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

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

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

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

4

3 回答 3

1

如果您想要一组测试,请使用std::vector<std::function<void()>> tests;然后您可以简单地使用tests.push_back([=] { do_test(the_args, I_captured, from_local, scope); });.

std::bind如果您的编译器不支持 lambda ,您可以使用类似的技巧。

作为最终用户,您无需编写自己的通用函数接口。它已经完成了。

编辑:是的,如果你不这样做,你最终会得到一些 C 风格的垃圾 A)重新实现 Boost 或 STL 提供的轮子,或者 B)使用 Boost 或 STL 提供的现有轮子。在“编写自己的好代码”或“使用别人的好代码”之间没有神奇的第三选择,仍然会产生好代码。

于 2012-05-15T22:23:47.610 回答
1

是的。用户不会传入任意数据结构,但可以通过扩展您的基类来创建任意数据结构。

class Test_Class {
    Run_Test(const Config& config);
};

客户端代码:

class MyConfig : public Config {
    //...
};

另一种选择是模板。您可以使用其中任何一个来完成许多常见任务,我不确定在这种情况下哪个是理想的,所以如果您走这条路,我会将其留给其他答案或让您研究。

于 2012-05-15T22:24:56.323 回答
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);
}
于 2012-05-15T22:51:30.410 回答