花了整整一年时间,但我已经通过David Vandevoorde和Nicolai M. Josuttis的C++ Templates - The Complete Guide工作了,现在我被困在最后一章的最后一部分 - 价值粘合剂,因为过去3周。
值绑定器的介绍,第427页的第22.8节,很容易理解,但我发现本节其余部分的例子很难理解。具体来说,我不明白 Binder
(请参阅functors/binder1.hpp和functors/binder2.hpp和BinderParams
类(请参阅functors/binderparams.hpp)试图实现。我的困难不在于模板语法,而在于这些类背后的意图。
Binder
类如何执行绑定? BinderParams
类如何识别(?)参数?这就是我难以看到/理解的。
答案 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 );
即。函数bind1st
和bind2nd
接受一个函数和一个参数,并返回函数对象的binder1st
和binder2nd
。调用这些函数对象将调用函数f
,其第一个或第二个参数的计算结果为x
。
您在V&amp; J中提到的部分是该功能的实现。它已被C ++ 11中的更为通用std::bind
取代,它具有签名
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
std::bind
的返回类型是您可以存储到auto
变量但未明确提及的内容。要实现的代码非常棘手,因为您必须存储要绑定的参数的位置,类型和值。