2015-12-14 45 views
1

所以我有這個方法我Bar類中:如何將std :: bind一個智能指針返回方法?

std::shared_ptr<sf::Sprite> Bar::getStuff() const 
{ 
    //... 
} 

我有我的回調的typedef:

typedef std::function<void()> Callback; 

void Foo::registerCallback(const Callback& callback) 
{ 
    //... 
} 

現在我想在這種方法使用std::bind,如:

Foo foo; 
Bar bar; //I create an instance of an Bar, called bar. 

foo.registerCallback(std::bind(&Bar::getStuff, std::ref(bar))); //<--- ERROR!!!! 

錯誤:

error C2562: 'std::_Callable_obj<std::_Bind<true,std::shared_ptr<sf::Sprite>,std::_Pmf_wrap<std::shared_ptr<sf::Sprite> (__thiscall Bar::*)(void) 

如果我想使用void方法,那就沒問題。但我需要使用getStuff()方法,它將返回一個smart pointer到sf :: Sprite的東西。

我該如何做到這一點?

+0

嘗試'的std ::綁定(酒吧:: getStuff,&巴)'代替,IIRC,'的std :: ref'不能在'INVOKE' –

+1

@PiotrSkotnicki'bind'解開'reference_wrapper's使用獨立於'INVOKE'。 (並且[LWG 2219](http://wg21.link/lwg2219)使得'INVOKE'無論如何都能和它們一起工作。) –

+0

MSVC的哪個版本是這樣的? –

回答

3

鑑於您使用的是C++ 11,爲什麼不使用lambda?

foo.registerCallback([&bar]() { bar.getStuff(); }); 
+0

@Nicol,我把它留作拷貝,因爲通常情況下你會希望生命期得到保證(因爲它是一個回調函數),所以假設'bar'在'shared_ptr'中 - 這將是正確的模型... – Nim

+0

是的,但他的代碼使用'std :: ref'明確地綁定它。如果他想要一個副本,他會堅持在那裏的價值。顯然,使用引用是一個壞主意,但這是他要求的。 –