Boost.Bind
可用于替换来自C++标准的std::bind1st()、std::bind2nd()函数
- 定义于 boost\bind.hpp
- 使用:boost::bind(FucPtr, _1);
- _1是占位符,与其相似还有_2、_3,表示FuncPtr的第(数字)个参数的占位,可以用来定义FuncPtr是一元、二元或是三元函数。比如:bind一个二元函数:boost::bind(FuncPtr, _1, _2);
Boost.Ref
Boost.Ref通常和Boost.Bind一起使用。
提供:boost::ref()和boost::cref()
- 定义于boost\ref.hpp
由于boost::bind()会复制它的参数,因此当要用于boost::bind()的函数带有至少一个引用参数时,引用必须特别处理。(用boost::ref)
- 使std::cout流可以被以引用方式传递:
boost::bind(FuncPtr, _1, _2, boost::ref()) - 以引用方式传递常量对象,可以用模板函数boost::cref()
Boost.Function
用于封装函数指针
-
定义于:boost\function.hpp
-
boost::function 可以定义一个指针,指向具有特定签名的函数。
-
boost::function<int (const char*)> f = std::atoi;
以上例子定义了一个指针 f,它可以指向某个接受一个类型为 const char* 的参数且返回一个类型为 int 的值的函数。 定义完成后,匹配此签名的函数均可赋值给这个指针。
注意,给定的数据类型并不需要精确匹配:虽然 std::strlen() 是以 std::size_t 作为返回类型的,但是它也可以被赋值给 f。
因为 f 是一个函数指针,所以被赋值的函数可以通过重载的 operator()() 操作符来调用。 取决于当前被赋值的是哪一个函数。
如果 f 未赋予一个函数而被调用,则会抛出一个 boost::bad_function_call 异常。 -
将值0赋给一个boost::function类型的函数指针,将会释放当前所赋的函数。(相当于函数指针未赋值状态)
-
检查一个函数指针是否被赋值某个函数,可以用empty函数或operator bool()操作符。
-
通过boost::function,类成员函数也可以被赋值给类型为boost::function的对象 。
BOOST.Lambda
匿名函数
定义于:boost\lambda\lambda.hpp
头文件 boost/lambda/if.hpp 定义了几个结构,允许在 lambda 函数内部使用 if 语句。 最基本的结构是 boost::lambda::if_then() 模板函数,它要求两个参数:第一个参数对条件求值 - 如果为真,则执行第二个参数。 如例中所示,每个参数本身都可以是 lambda 函数。
除了 boost::lambda::if_then(), Boost.Lambda 还提供了 boost::lambda::if_then_else() 和 boost::lambda::if_then_else_return() 模板函数 - 它们都要求三个参数。 另外还提供了用于实现循环、转型操作符,甚至是 throw - 允许 lambda 函数抛出异常 - 的模板函数。
虽然可以用这些模板函数在 C++ 中构造出复杂的 lambda 函数,但是你必须要考虑其它方面,如可读性和可维护性。 因为别人需要学习并理解额外的函数,如用 boost::lambda::if_then() 来替代已知的 C++ 关键字 if 和 else,lambda 函数的好处通常随着它的复杂性而降低。 多数情况下,更为合理的方法是用熟悉的 C++ 结构定义一个单独的函数。