2017-05-01 32 views
3

這可能是一個愚蠢和愚蠢的事情要做 - 但我想了解這裏發生了什麼。std ::綁定在調用操作員的成員

我有以下代碼:

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

所以基本上員會工作像任何其他對象的方法,允許它被調用爲:

dummy d; 
d.member() 

這將打印call::operator()

現在我想用綁定來做到這一點,初步實現是這樣的:

int main() 
{ 
    dummy d; 

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

這編譯,但沒有打印。我真的不明白髮生了什麼事 - 它編譯的事實,但沒有產生輸出困惑我:)肯定有一些魔術在std::bind肚子裏,但什麼?

下面是代碼打一個鏈接: https://ideone.com/P81PND

回答

6

目前,您的綁定返回一個成員,所以b()d.member。 你將不得不調用operator()上:

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

作爲替代方案,你可以使用任何的:

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

你是對的! :)我們只是發現自己。 'std :: bind'只會返回成員,今天學到了一些新東西 - 謝謝! – mortenvp

+0

@mortenvp:無論如何,Lambdas呈現'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