2017-05-01 7 views
3

これは愚かで愚かなことかもしれませんが、ここで何が起こっているのか理解したいと思います。 call::operator()を印刷しstd :: bind on call operator

dummy d; 
d.member() 

#include <iostream> 
#include <functional> 

namespace 
{ 
    struct call 
    { 
     void operator()() const 
     { 
      std::cout << "call::operator()" << std::endl; 
     } 
    }; 

    struct dummy 
    { 
     dummy() = default; 
     dummy(const dummy&) = delete; 

     call member; 
    }; 
} 

だからメンバーは、本質的に、それは次のように呼び出すことができるように、他のオブジェクトのメソッドのように動作します:

は、私は、次のコードを持っています。

今、私はそれを行うためにバインドを使用したいと思い、最初の実装は、このように見えた:

int main() 
{ 
    dummy d; 

    auto b = std::bind(&dummy::member, &d); 
    b(); 
    return 0; 
} 

これはコンパイルしますが、何も印刷されません。私は実際に起こっていることを理解していない - それはコンパイルするが、出力パズルを生成しないという事実私は確かにいくつかの魔法はstd::bindの腹の中で起こっているが、何?ここで

は、コードと遊ぶためのリンクです: https://ideone.com/P81PND

答えて

6

現在、あなたのバインドがメンバーを返し、そうb()d.memberです。 あなたはその上で()演算子を呼び出す必要があります:別の方法として

b()(); // call::operator() 

、あなたは、任意の使用可能性があります

b = std::bind(&call::operator(), &d.member); 
b = [&]() {d.member();}; 
+0

あなたは正しいです! :)私たちはちょうどそれを自分自身から見つけました。 'std :: bind'はメンバを返すだけで、今日何か新しいことを学んだことになります - ありがとう! – mortenvp

+0

@mortenvp:Lambdaは 'std :: bind'をとにかく役に立たないようにします。将来のバージョンのC++で非推奨にすることについての議論があります。 http://stackoverflow.com/questions/33835922/why-should-bind-be-deprecated –

+0

@ Jarod42を参照してください。意外にも、 'std :: cref' - 下記を参照してください。 –

0

あなたはまた、std::reference_wrapperを通じて呼び出すことができます。 bindの必要は全くありません。

int main() 
{ 
    dummy d; 

    auto b= std::cref(d.member); // create reference wrapper 
    b(); 
    return 0; 
} 
+1

または定期的な参照。 – Jarod42

関連する問題