11

我有一个一维函数最小化器。现在我正在传递函数指针。然而,许多函数有多个参数,其中一些是固定的。我已经使用这样的函子实现了这一点

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

4 回答 4

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.

于 2009-06-25T15:54:15.873 回答
4

我会这样定义 minimum() :

minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f)
{
    ...
}

然后你可以像这样调用minimize():

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));
于 2009-06-25T15:55:13.970 回答
3

将参数更改为值参数。函数对象是故意轻量级的,boost::bind当然是经过专门设计的,以适应几个字节的空间使用boost::compressed_pair和不使用的东西。

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

然后你可以将它的结果传递给它boost::bind。请记住,这boost::bind实际上是一个返回某种类型对象的函数模板。所以minimize有一个非常量引用参数是行不通的。

于 2009-06-25T15:56:56.717 回答
1

首先,您将模板参数作为 ref-to-non-const,因此 boost::bind 的临时返回不会绑定到它。所以你可以像这样使用它:

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

但是如果你也想在你的 Functor 中使用它,它们就必须有一个 const operator()。所以也许按价值计算更好:

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

我相信返回 T::result_type 将强制 T 成为 boost::function (而不是复杂的类型绑定返回),但我不是 100%

于 2009-06-25T15:57:32.270 回答