1

我正在开发一个新平台,我的代码是:

第一层:

Call_To_Layer2 (param1, param2);

第 2 层:

Call_To_Layer2(param1, param2)
{
    Dispatch_Work_To_Thread(param1, param2);
}

Dispatch_Work_To_Thread(param1, param2)
{
    // create a new thread and execute the task
}

来自 Layer1 的函数调用可以有任意数量的参数。那么如何在 Layer2 中设计这样的方法呢?layer2 中的 Dispatch_Work_To_Thread 方法需要函数名作为参数之一。既然参数的个数不是固定的,那怎么设计呢?

我一直在思考这个问题的设计,但直到现在才想出任何解决方案。

4

4 回答 4

1

一种选择是使用,Call_To_Layer2并使用任何函数名称和参数创建函数对象。Dispatch_Work_To_Threadstd::function<void(void)>

第 1 层功能:

void foo_layer1(param1, param2);
void bar_layer1(param1, param2);

第 2 层:

#include <functional>

Call_To_Layer2 (std::function<void(void)> f); // or reference_wrapper to std::function

f00 = std::bind(foo_layer1, param1, param2);
Call_To_Layer2(foo);  // passes it on to `Dispatch_Work_To_Thread`

如果您没有所需的 C++11 支持,则可以改用boost.functionboost.bind

于 2012-10-03T05:55:55.110 回答
0
  1. 也许将所有参数放在一个结构或一个类中,然后将一个对象传递给Call_To_Layer2?如果类可以封装变量因子,这将起作用。

  2. 另一种选择是使用可变参数函数语法Call_To_Layer2(param1, param2, ...)

于 2012-10-03T05:38:12.903 回答
0

如果没有更具体的示例,很难知道最佳解决方案是什么。

可变参数函数可能是一种选择,尽管如今它们大多被认为是过时的。

最简单的可能是将参数简单地包装在 astd::vector或类似文件中,然后让第 2 层代码根据需要将它们解包。

于 2012-10-03T05:50:38.693 回答
0

这不是 C++ 可以移植的事情。但是,您可以稍微改变一下,让您的函数接受一个参数,该参数是一个包含所有相关参数的映射:

typedef std::map<std::string, Anything> Parms;

Anything function1(const Parms& parms)
{
    double x = parms("x");
    std::string title = parms("title");
    ...
}

void init_module()
{
    register_function("function1", function1,
                      "void return, double x, string title");
}

在上面的示例Anything中是一个类,它可以包含您想要支持的任何类型作为参数或返回值。我习惯于自己编写代码,但可能boost::any还可以。每个发布的函数只接受一个参数字典,并且该函数还发布返回类型和参数。此信息存储在用于调度和参数检查的映射中,因此您无需对所有功能进行代码检查,并且还允许发布目录服务。

您还可以使用实现“调用”方法的类的实例,而不是发布服务的函数(这是我习惯做的)。

不幸的是,C++ 设计与这个用例不太兼容,需要大量编码。在运行时提供函数名称和参数的情况下,没有像“使用此名称调用函数并传递这些参数”这样的事情。

请注意,另一方面,这种用法并不少见,因此您可以找到许多试图将这种动态性添加到 C++ 的库......它们如何适合您的确切问题,它们具有哪些依赖关系以及它们的复杂程度是必须考虑的事情。

于 2012-10-03T06:00:08.173 回答