【问题标题】:Passing arbitrary data to a function without void pointers将任意数据传递给没有 void 指针的函数
【发布时间】:2012-05-23 11:44:30
【问题描述】:

我正在使用实现一组系统测试的抽象基类。简而言之,类声明是:

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

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

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

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

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

【问题讨论】:

  • boost::any 正是为此类任务而设计的。
  • 同意 boost::any,不幸的是,boost 库和 STL 在我们的项目中都不可用。更新了问题以反映这一事实。
  • @DeadMG 嵌入式系统级芯片客户呢?我的客户甚至不允许我使用 c++
  • 事实上,这是针对嵌入式系统的。谢谢大家的帮助。

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


【解决方案1】:

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

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

客户端代码:

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

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

【讨论】:

  • 您建议将 Config 作为参数传递的基类,可以针对特定测试进行扩展?
  • 是的。然后客户端可以适当地处理,但我会告诉您,如果您的客户端必须使用 dynamic_cast 来检索它已经设计错误的派生 Config。听起来您希望客户提交整个测试。您可以为 Config 提供一个类似 bool doTest() 的方法或使其成为仿函数,或者使用类似@DeadMG 的答案的方法。如果您仍然需要更通用的东西,那么重新设计 Test_Class 以便它为客户端提供运行测试所需的数据,而不是从客户端获取不知道如何处理的非常通用的数据。
  • 公平点。选角的程度从一开始就让我不舒服。
【解决方案2】:

如果您想要一组测试,请使用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 提供的现有轮子。在“编写自己的好代码”或“使用别人的好代码”之间没有神奇的第三选择,仍然会产生好代码。

【讨论】:

  • 一个很好的观点。我们无法在这个项目上使用 STL,否则我同意。并且正在更新我的问题以明确该限制。
【解决方案3】:

我不记得是否有可能/如何对类内的函数进行参数检测,所以也许这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2013-01-27
    • 2012-11-08
    相关资源
    最近更新 更多