我正在开发一个新平台,我的代码是:
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方法需要函数名作为参数之一。由于参数的数量不是恒定的,如何设计?
我一直在考虑这个问题的设计,但到目前为止还没有找到任何解决方案。
答案 0 :(得分:1)
一个选项是让Call_To_Layer2
和Dispatch_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.function和boost.bind。
答案 1 :(得分:0)
可能将所有参数放在结构或类中,并将对象传递给Call_To_Layer2
?如果类可以封装变量因子,这将起作用。
另一个选择是使用可变函数语法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 ++中的库...它们如何适合您的确切问题,它们具有哪些依赖关系以及复杂程度如何他们是必须考虑的事情。