使用boost :: function作为函数参数?

时间:2011-10-17 08:42:24

标签: c++ function boost bind

我想调用一个函数foo,让它表现得与众不同 (我采用策略或命令模式。它们看起来与我类似。)

我的整体计划如下。

首先,定义foo以采用boost :: function type

foo(boost::function<someType> execFunction)
{
// do something 
execFunction(args);
// do something
}

然后,我根据我的需要给foo()不同的函数(作为参数)。

这会有用吗?或者你会反对吗? 欢迎提出任何意见。

修改

次要相关问题是, 有时execFunction需要1个参数,有时需要2个参数。

我可以在两种情况下都使用boost :: function,并在不需要时忽略第二个参数 有更清洁的方法吗?

2 个答案:

答案 0 :(得分:4)

这非常有效。但有时候最好和a一起工作 仿函数,因此您的调用者可以自由选择最适合他们的东西,并防止boost::function带来的小额开销:

template<typename Func>
void foo(Func f) {
  f(myArgs);
}

您还可以为特定boost::function添加重载,以便通过引用获取对象。

template<>
void foo(const boost::function<void (expectedtypes)>& f) {
  f(myArgs);
}

也可能为constness重载了。

对于接受不同arity的boost::function个对象的情况,我会使用重载。如果你走这条路线,请避免使用模板化版本,因为一旦用户尝试使用仿函数(而不是boost::function具有不同的arity),您将遇到麻烦。这个麻烦是可以解决的,但可能会变得混乱。您需要将调用发送到检测向导的arity并执行正确调用的内容。但正如你所说模板是你的弱点,这不是真的推荐。

答案 1 :(得分:0)

这是一种常见的模式,并且会起作用。我过去曾经使用过它,并且很可能在将来使用它。我尝试仅在某些特定的用例中使用它,因为它减少了极大的耦合,虽然这通常是好的,但它更难以遵循代码中的控制流(即如果你滥用它,它将是真的除了在调试器中运行它之外,很难找到你的程序要做的事情。但对于特定的任务,它很好。

如果您不需要存储function<>供以后使用,或者在被叫方端存在任何运行时多态行为,您还可以考虑使用函数模板,以便调用者不需要转换为{ {1}}在执行你的功能之前。