3

它花了整整一年的时间,但我已经完成了C++ 模板 - David Vandevoorde 和 Nicolai M. Josuttis 的完整指南,现在我被困在上一章的最后一部分 - 价值粘合剂,过去 3周。

第 457 页的第 22.8 节对 value binders 的介绍非常简单易懂,但我发现该部分其余部分的示例难以理解。具体来说,我不明白参见Binderfunctors / binder1.hpp和functors /binder2.hppBinderParams类(参见functors/binderparams.hpp)试图实现的目标。我的困难不是模板语法,而是这些背后的意图类。

类如何Binder执行绑定?类如何BinderParams识别(?)参数?这就是我难以看到/理解的内容。

4

3 回答 3

5

它是partial application的一种实现,您可以在其中获取一个函数(或函子),并将一个值“绑定”到它的一个参数上,以获得一个新的函子,并少一个参数。

这对于将通用函数与特定数据结合起来最有用,而无需自己编写额外的样板代码。

考虑:您想通过对每个元素应用一个函数来转换一个集合,从而生成一个相同大小的新集合。例如,std::transform需要一元函数。如果您已经有一个函数可以执行您想要的操作但需要更多参数(例如,AddTwoThings当您只想向每个元素添加相同的常量时,Kerrek's),您可以:

  • 重写它
  • 编写另一个函数来调用第一个函数并固定一个参数
  • 或者,您可以将一个参数绑定到固定值,得到一个可用的一元函数std::transform

有关显示 Vandevoorde & Josuttis 系统的 C++11 标准等效项的简单使用的示例,请参阅令人惊讶的详细cppreference 示例

于 2012-09-19T12:04:08.997 回答
4

我没有这本书,我也不会去买它来回答这个问题(你应该修改它以使其独立),但我认为总体思路是这样的:

struct AddTwoThings
{
     int operator()(int a, int b) const { return a + b; }
};

typedef Binder<AddTwoThings, 0, int> AddThingToSomething;
//                           ^  ^^^
//                           |   |
//      argument position? --+   +-- bound type

AddTwoThings add2;
AddThingToSomething add10(add2, 10);

现在add10(n)与 相同add2(10, n),即10 + n

于 2012-09-19T11:30:59.230 回答
3

看签名

template< class F, class T >
std::binder1st<F> bind1st( const F& f, const T& x );

template< class F, class T >
std::binder2nd<F> bind2nd( const F& f, const T& x );

即函数bind1stbind2nd接受一个函数和一个参数并返回函数对象的binder1stbinder2nd。调用这些函数对象将调用函数f,并将其第一个或第二个参数评估为x

您在 V&J 中提到的部分是该功能的实现。它已在 C++11 中被std::bind具有签名的更通用取代

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );

的返回类型std::bind是可以存储到auto变量中但不明确提及的东西。要实现的代码非常棘手,因为您必须存储要绑定的参数的位置、类型和值。

于 2012-09-19T11:35:34.193 回答