BOOST--函数对象

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)

  1. 使std::cout流可以被以引用方式传递:
    boost::bind(FuncPtr, _1, _2, boost::ref())
  2. 以引用方式传递常量对象,可以用模板函数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++ 结构定义一个单独的函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值