我有一维功能最小化器。现在我正在传递函数指针。然而,许多功能具有多个参数,其中一些参数保持固定。我已经使用像这样的仿函数实现了这个
template <class T>
minimize(T &f) {
}
Functor f(param1, param2);
minimize<Functor>(f);
然而,函子定义有很多问题。 Boost :: bind看起来更干净。所以我可以这样做:
minimize(boost:bind(f,_1,param1,param2))
但是,我不清楚我的minimize
声明应该使用boost::bind
。什么类型的对象是boost::bind
?是否有一个简单的模式,避免仿函数的样板,但允许多参数绑定?
答案 0 :(得分:17)
您可以使用boost::function
。我认为boost::bind
确实有自己的返回类型,但它与boost::function
兼容。典型用法是为函数创建一个typedef:
typedef boost::function<bool(std::string)> MyTestFunction;
然后您可以使用boost::bind
传递任何兼容的功能:
bool SomeFunction(int i, std::string s) { return true; }
MyTestFunction f = boost::bind(SomeFunction, 42, _1);
f("and then call it.");
我希望这就是你想要的。
它还可以通过将调用的this
指针作为第二个参数传递给boost::bind
来处理方法。
答案 1 :(得分:4)
我会用这种方式定义minimize():
minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f)
{
...
}
然后你可以像这样调用minimize():
minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));
答案 2 :(得分:3)
将参数更改为值参数。函数对象是有意识的轻量级,boost::bind
当然是特制的,使用boost::compressed_pair
来填充几个字节的空间,什么不是。
template <class T>
void minimize(T f) {
}
然后你可以传递boost::bind
的结果。请记住,boost::bind
实际上是一个返回某种类型对象的函数模板。因此让minimize
具有非const引用参数不起作用。
答案 3 :(得分:1)
首先,您将模板参数作为ref-to-non-const,因此boost :: bind的临时returend不会绑定到它。所以你可以使用它:
template <class T>
T::result_type minimize(const T &f) {
}
但是如果你想在你的Functors中使用它,那么它们必须有一个const运算符()。所以也许价值更好:
template <class T>
T::result_type minimize(T f) {
}
我相信返回为T :: result_type将强制T为boost :: function(而不是复杂类型bind返回),但我不是100%