C ++中的通用函数实现

时间:2012-10-03 05:33:38

标签: c++

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

层1:

Call_To_Layer2 (param1, param2);

二层:

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 个答案:

答案 0 :(得分:1)

一个选项是让Call_To_Layer2Dispatch_Work_To_Thread获取std::function<void(void)>,并使用任何函数名称和参数创建函数对象。

Layer1功能:

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

答案 1 :(得分:0)

  1. 可能将所有参数放在结构或类中,并将对象传递给Call_To_Layer2?如果类可以封装变量因子,这将起作用。

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

答案 2 :(得分:0)

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

Variadic functions可能是一种选择,尽管这些日子大多被认为是过时的。

最简单的方法可能是简单地将参数包装在std::vector或类似内容中,然后让第2层代码在适当的时候解压缩它们。

答案 3 :(得分: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 ++中的库...它们如何适合您的确切问题,它们具有哪些依赖关系以及复杂程度如何他们是必须考虑的事情。