2017-05-01 2 views
3

Das könnte eine alberne und dumme Sache sein - aber ich würde gerne verstehen, was hier passiert.std :: bind auf Mitglied mit Call Operator

Ich habe den folgenden Code:

#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; 
    }; 
} 

So Mitglied im Wesentlichen wie jedes andere Objekt Methode funktionieren würde, so dass sie als aufgerufen werden:

dummy d; 
d.member() 

Welche call::operator() drucken.

Nun möchte Ich mag binden verwenden, das zu tun, sah die erste Implementierung wie folgt aus:

int main() 
{ 
    dummy d; 

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

Dies kompiliert, aber nichts gedruckt wird. Ich verstehe nicht wirklich, was passiert - die Tatsache, dass es kompiliert, produziert aber keine Ausgabe Rätsel mich :) sicherlich etwas Magie geht in den Bauch von std::bind, aber was?

Hier ist ein Link mit dem Code zu spielen: https://ideone.com/P81PND

Antwort

6

Derzeit Ihre bind ein Mitglied zurückkehren, so b()d.member ist. Sie müssten Operator() aufrufen, dazu:

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

Als Alternative kann verwenden Sie eines:

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

Sie haben Recht! :) Das haben wir gerade selbst herausgefunden. 'std :: bind' wird nur das Mitglied zurückgeben, hat heute etwas Neues gelernt - danke! – mortenvp

+0

@mortenvp: Lambdas rendern 'std :: bind' sowieso ziemlich nutzlos. Es wurde diskutiert, es in einer zukünftigen Version von C++ abzulehnen. Siehe http://stackoverflow.com/questions/33835922/why-should-bind-be-deprezed –

+0

@ Jarod42, und überraschend, 'std :: cref' - siehe unten. –

0

können Sie auch durch einen std::reference_wrapper nennen. Keine Notwendigkeit für bind überhaupt.

int main() 
{ 
    dummy d; 

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

Oder regelmäßige Referenz. – Jarod42

Verwandte Themen