了解值绑定
Understanding Value Binders
花了整整一年的时间,但我已经完成了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 );
即函数bind1st
和bind2nd
接受一个函数和一个参数,并返回函数对象的binder1st
和binder2nd
。调用这些函数对象将调用函数f
,其第一个或第二个参数的计算结果为x
。
您在 V&J 中提到的部分是该功能的实现。它在 C++11 中已被具有签名的更一般的std::bind
所取代
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
std::bind
的返回类型是可以存储到auto
变量中但不显式提及的内容。要实现的代码非常棘手,因为您必须存储要绑定的参数的位置、类型和值。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 了解C++如何返回引用并绑定到引用
- 试图了解动态绑定和虚拟功能
- 了解GL_SHADER_STORAGE_BLOCK绑定
- 了解值绑定
- C++ 了解变量生存期和绑定生存期之间的区别
- 了解引用绑定