2015-12-14 112 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'明确地绑定它。如果他想要一个副本,他会坚持在那里的价值。显然,使用引用是一个坏主意,但这是他要求的。 –