boost lambda簡介



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.
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章