如何在函数中传递boost::bind对象?

11

我有一个一维函数的最小化器。目前我正在传递函数指针。然而,许多函数具有多个参数,其中一些被固定。我使用了functor来实现这一点,如下所示:

template <class T>
minimize(T &f) {
}

Functor f(param1, param2);
minimize<Functor>(f);

然而,函数对象的定义却非常冗长。使用 Boost::bind 更加简洁。因此,我可以这样做:

minimize(boost:bind(f,_1,param1,param2))

然而,我不清楚如何使用boost::bind来声明我的minimize。那么,boost::bind是什么类型的对象呢?有没有一种简单的模式可以避免使用函数对象的样板代码,但又允许多个参数绑定?

4个回答

18

您可以使用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,也可以用于方法调用。


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,...));

3

将参数更改为值参数。函数对象故意轻量级,而boost::bind则是专门设计的,可以使用boost::compressed_pair等方法在几个字节的空间内适应。

template <class T>
void minimize(T f) {
}

然后,您可以将boost::bind的结果传递给它。请记住,boost::bind实际上是一个函数模板,返回某种类型的对象。因此,使minimize具有非const引用参数是不可能的。


1
首先,你将模板参数作为非常量引用进行传递,因此由boost::bind返回的临时对象无法与其绑定。所以你可以这样使用它:
template <class T>
T::result_type minimize(const T &f) {
}

但是,如果您想将其与Functors一起使用,则它们必须具有const operator()。因此,按值传递可能更好:

 template <class T>
 T::result_type minimize(T f) {
 }

我相信将返回值设置为T::result_type会强制T成为boost::function(而不是bind返回的复杂类型),但我不确定是否百分之百正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接