了解值绑定

Understanding Value Binders

本文关键字:绑定 了解      更新时间:2023-10-16

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

价值活页夹的介绍,第 457 页的第 22.8 节,很容易理解,但我发现本节其余部分的示例很难理解。具体来说,我不明白Binder(参见functors/binder1.hpp和functors/binder2.hpp)和BinderParams类(参见functors/binderparams.hpp)试图实现的目标。我的困难不在于模板语法,而在于这些类背后的意图。

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

它是部分应用程序的实现,其中你接受一个函数(或函子),并将一个值"绑定"到它的参数之一,以获得一个新的函子少一个参数。

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

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

  • 重写它
  • 编写另一个函数以调用第一个固定一个参数的函数
  • 或者,您可以将一个参数绑定到固定值,从而获得一个可通过std::transform

有关显示Vandevoorde&Josuttis系统的C++11标准等效物的简单用法的一些示例,请参阅令人惊讶的详细cpp首选项示例。

我没有这本书,我也不会去买它来回答这个问题(你应该重新设计以使其自成一体),但我假设总体思路是这样的:

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.

查看 的签名

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变量中但不显式提及的内容。要实现的代码非常棘手,因为您必须存储要绑定的参数的位置、类型和值。