了解值绑定器

时间:2012-09-19 11:12:57

标签: c++ templates generics c++11

花了整整一年时间,但我已经通过David Vandevoorde和Nicolai M. Josuttis的C++ Templates - The Complete Guide工作了,现在我被困在最后一章的最后一部分 - 价值粘合剂,因为过去3周。

值绑定器的介绍,第427页的第22.8节,很容易理解,但我发现本节其余部分的例子很难理解。具体来说,我不明白 Binder(请参阅functors/binder1.hppfunctors/binder2.hppBinderParams类(请参阅functors/binderparams.hpp)试图实现。我的困难不在于模板语法,而在于这些类背后的意图。

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

对于一些示例,显示了Vandevoor& C的C ++ 11标准等价物的简单用法。 Josuttis的系统,看到令人惊讶的详细cppreference examples

答案 1 :(得分: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

答案 2 :(得分: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&amp; J中提到的部分是该功能的实现。它已被C ++ 11中的更为通用std::bind取代,它具有签名

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

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