Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > boost lambda简介
【标  题】:boost lambda简介
【关键字】:boost,lambda
【来  源】:http://blog.csdn.net/delphihero/archive/2006/09/23/1267820.aspx

boost lambda简介

Your Ad Here

1, 简介
  有的时候我们实在是很烦写一个function object了. 为了一个简单的目的,
  不得不跳到很远的某一个hpp文件里面去在声明一个function object, ft.
  lambda能帮你去除烦恼.

  btw: lambda并不仅仅为了方便你"写"程序. 它能在代码优化上发挥一定的作用.

2, 使用
  套用一下,
  for_each(x, x+N, std::cout <<_1 * 1.8);
  很简单是吗?

3, 实现

这个东西寒假时候学习过, 所以提上来先写吧.
如果还是从源代码来看他的实现, 我想我又要累个半死了.
所以这次决定偷懒, 我直接从一个简单的实现来说明这
个东西到底是怎么工作的. 这个实现是从blitz作者主页上
的例子剪裁的, 并非我原创, 特此声明!!

首先, 定义一个包装用的类
  template<class A>
  struct DExpr {
   A a_;

   DExpr(const A& x) : a_(x){ }

    double operator()(double x) const
    { return a_(x); }
  };
  显然这个类什么也不会作, 摆在这里的作用类似于一个boost::any
  然后
  struct DExprIdentity {
    DExprIdentity() { }

    double operator()(double x) const
    { return x; }
  }; //Identity, 就当是我们数学概念里面的变量了 ;)
  struct DExprLiteral {
    double value_;

    DExprLiteral(double value)
    { value_ = value; }

    double operator()(double ) const
    { return value_; }
  }; //Literal, 就当是我们数学概念里面的常量吧
  struct DApAdd {
    DApAdd() { }

    static inline double apply(double a, double b)
    { return a+b; }
  }; //这个类里面定义了一个方法apply, 具体实现了加法
  template<class A, class B, class Op>
  struct DBinExprOp {
    A a_;
    B b_;

    DBinExprOp(const A& a, const B& b)
      : a_(a), b_(b)
    { }

    double operator()(double x) const
    { return Op::apply(a_(x), b_(x)); }
  }; //注意这里的用法,^^^^^^^^^^^^^^
  template<class A>
  DExpr<DBinExprOp<DExprLiteral, DExpr<A>, DApAdd> >
  operator+(double x, const DExpr<A>& a)
  {
    typedef DBinExprOp<DExprLiteral, DExpr<A>, DApAdd> ExprT;
    return DExpr<ExprT>(ExprT(DExprLiteral(x),a));
  } //重载了加法
    就是这些了, 假设我们定义了一个DExpr<DExprIdentity> a;
    那么a+1.2就是一个函数对象了(因为他确实有一个operator()函数).
    当我们对a+1.2调用(a+1.2)(3.4)的时候, 其实是调用了
    DApAdd::apply(DExprIdentiry(a)(3.4), DExprLiteral(1.2)(3.4));
     //  注意a构造成一个identity, 所以对它调用(3.4)返回的就是3.4
     //  注意1.2构造成一个Literal, 所以对它调用(3.4)返回的还是1.2
     //  综合起来(a+1.2)(3.4)返回的就是 4.6.
 
boost pool 内存池:【上一篇】
boost timer类介绍:【下一篇】
【相关文章】
  • boost pool 内存池
  • boost condition
  • VC利用boost库解析正则表达式
  • boost的安装以及它的regex的配置
  • STL, Loki,Boost 中Functor比较之Boost库(一)
  • 对Lambda的再学习
  • 使用 Boost.Python 嵌入 Python 模块到 C++
  • 在Dev-Cpp中编译Boost.Python
  • boost 线程同步Demo
  • 使用boost中的filesystem类库遍历某个目录所有的文件
  • 【随机文章】
  • 类似VB中的分类属性表控件
  • 《神话》主教心得
  • Linux下增加Apache的rewrite Module
  • 大于2G的gzip包不能gunzip的解决方法
  • Vi 使用说明[教程]
  • 外语欠佳不用愁!免费在线翻译任你行
  • ASP.NET程序中常用的三十三种代码(5)
  • 使用cpan2rpm获得cpan上的rpm包
  • Google Sugest
  • 办公室里面可以洗脚(续)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.