如何将boost :: bind对象传递给函数?

时间:2009-06-25 15:49:31

标签: c++ boost-bind

我有一维功能最小化器。现在我正在传递函数指针。然而,许多功能具有多个参数,其中一些参数保持固定。我已经使用像这样的仿函数实现了这个

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?是否有一个简单的模式,避免仿函数的样板,但允许多参数绑定?

4 个答案:

答案 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%