我想调用一个函数foo,让它表现得与众不同 (我采用策略或命令模式。它们看起来与我类似。)
我的整体计划如下。
首先,定义foo以采用boost :: function type
foo(boost::function<someType> execFunction) { // do something execFunction(args); // do something }
然后,我根据我的需要给foo()不同的函数(作为参数)。
这会有用吗?或者你会反对吗? 欢迎提出任何意见。
次要相关问题是, 有时execFunction需要1个参数,有时需要2个参数。
我可以在两种情况下都使用boost :: function,并在不需要时忽略第二个参数 有更清洁的方法吗?
答案 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}}在执行你的功能之前。