boost lambda式でプレースホルダパラメータのメンバー関数を呼び出す方法

2438 ワード

boostではlambda式の使い方が提供されていますが、lambda式の機能はまだ強くありません.ここではlambdaのプレースホルダパラメータしか使用できません.1などは+-*/などの最も基本的なオペレータを使用しますが、多くの場合、入力されたプレースホルダパラメータがオブジェクトポインタであれば、このクラスのメンバー関数を呼び出したい場合があります.
私は開発中にこの問題に遭遇しました.stlのアルゴリズムに関数を入力してオブジェクトの比較関数を呼び出す必要があります.これは面倒だと感じて、関数を再定義する必要があるので、lambda式を思い出しました.c++11のlambda式は試したことがありませんが、プロジェクト開発環境に限られていて、boostしか選択できません.しかし、boostのlambda式はプレースホルダパラメータで関数を呼び出すことをサポートしていないことに気づき、ネット上で長い間探しても関連記事が見つからなかった.最後にboostの公式ドキュメントで解決策を見つけましたが、このスキームは簡単に関数を呼び出すしかなく、関数の戻り値を操作することはできませんが、関数の戻り値を比較するなど、できない場合があります.この方法を用いて関数を呼び出すのは単なる一挙であり,bindを用いて同様の機能を達成することができ,bindはスマートポインタを識別することができる.
これはboostの公式インスタンスです.注意してください.使用してください.1時にboost::lambdaネーミングスペースを限定しなければなりません.そうしないとコンパイルエラーになります.
struct B { int foo(int); };
B* b = new B();
  ...
(b ->* &B::foo)         // returns a delayed call to b->foo
                        // a function argument list must follow
(b ->* &B::foo)(1)      // ok, calls b->foo(1)

(_1 ->* &B::foo)(b);    // returns a delayed call to b->foo, 
                        // no effect as such
(_1 ->* &B::foo)(b)(1); // calls b->foo(1)

最后に他の方法を探すしかなくて、最后についに私に1种の代替の方法を考えられて、しかしやはりいくつか欠陥があって、しかしいくつか简単な呼び出しをするのはやはりできて、ここで分かち合って、1つの空白を埋めます.
その核心思想はlambda式でbindを使用してプレースホルダパラメータをバインドして呼び出し関数を完成させるための機能を調整することであるが、後で説明する欠陥がある.
コードを見る
#include 
#include 
#include 
#include 
#include 
#include 

class A
{
public:
    int a;
    int b;
  virtual int  test()
  {
      std::cout<test();
}

int main()
{
//boost       ,                   ,       ,  
   std::cout<< ((boost::lambda::_1 ->* &A::test)) (new B)();
    //    ,  ,bind   ,      ,          
    boost::shared_ptro= boost::make_shared();
//lambdaでbindを  してプレースホルダパラメータを び すtestメソッド
std::cout<
    //         ,    bind          ,   bind          ,   
    //std::cout<boost::bind(&A::test,_1))(o));
    //       ,    bind          ,        ,  、==      ,
    //   +、-、*、/    ,    
    //std::cout<

代替法が見つかったが、bind式を演算子の左側に置くしかなく、比較オペレータのみをサポートする制限が多いが、stlアルゴリズムのような簡単な比較の場合、すでに十分で、以前より少し良い.
本人のレベルが限られているため、どうしても考えられないところがありますので、ご指摘ください.この問題に対する私の見方をこの文だけで表して、みんなと交流することができることを望んで、ありがとうございます!