STL_03: bind函数绑定说明
Asio中的异步操作都需要一个函数对象参数(即捕捉处理函数),当异步操作完成时会调用该对象。 捕捉处理函数的签名取决于操作的类型。 例如,使用io_service :: post()发布的处理程序必须具有以下签名:
void handler();
而异步等待操作期望:
void handler(error_code ec);
异步读/写操作需要处理函数:
void handler(error_code ec, size_t length);
一些特殊的应用程序需要将一些上下文传递给完成处理程序,例如this指针。 一种方法是使用功能对象适配器,例如boost :: bind,std :: tr1 :: bind或(从C ++ 0x开始)std :: bind。
不幸的是,对于许多C ++程序员而言,bind代表了一点魔力。 错误使用编译器时遇到的难以理解的编译器错误对此无济于事。 而且,根据我的经验,基本概念(其中一些函数参数的预先绑定,而另一些则延迟到调用点之前)可以呈现出陡峭的学习曲线。
我整理了一些图表来帮助解释绑定是如何工作的。 为了清楚起见,我没有完全遵守标准的C++语法(例如,省略了函数调用运算符上的参数类型)和(过度)简化了bind的实现。 最后,这些示例仅限于可能对Asio有用的示例。 欢迎提出意见和建议。
1. bind可以将用户提供的需要一个参数的函数转换为一个不需要参数的函数对象
bind可以用于将用户期望的函数改编为期望参数为零的函数对象。 绑定值(在此示例中为123)存储在函数对象中,并根据需要自动传递给用户提供的函数:
2.非静态函数成员的使用需要一个隐式的this参数
绑定参数可用于将类成员函数转换为零参数函数对象。 如您所知,非静态成员函数具有隐式this参数。 这意味着需要将适当的指针绑定到函数对象中:
3.可以将一个隐式的函数指针显式的传递给需要一个参数的函数对象
4.函数对象通常会同时使用绑定参数和使用时提供的参数。 这可以使用成员函数来完成
5.函数对象通常会同时使用绑定参数和使用时提供的参数。 这可以使用非成员函数来完成
6.有时函数对象的使用点会提供调用目标函数不需要的参数。 绑定将自动丢弃这些多余的参数
7.多余的参数不必在函数对象签名的末尾
8.bind允许您使用重新排序参数以使目标函数适应必要的函数对象签名