2013-11-24 30 views
1

我有一个函数对象typedef std::function<bool(Event*)> Handler。一个成员函数总是被分配给这个对象。所以,我使用std::bind来实现这一点。上述如何创建std :: wrap的包装

Handler f = std::bind(&LevelSystem::switchLevel, this, std::placeholders::_1); 
f(new Event("test")); 

此代码按预期工作,但我想换行std::bind在辅助功能更清晰的代码。这是我想出的。

template<class Func> inline Handler MemFn(Func &&f) { 
    return std::bind(f, this, std::placeholders::_1); 
    } 

和使用将是:

Handler f = MemFn(&LevelSystem::switchLevel); 

我使用此功能时得到一个错误:

No viable conversion from 
'__bind<bool(LevelSystem::*&)(Event *), System *,std::__1::placeholders::__ph<1> &>' to 
'Handler' (aka 'function<bool(Event *)>') 

我不理解的错误。

+1

什么是'this'内'MemFn'的背景? – 0x499602D2

+0

作为LevelSystem的基类的系统。我改变了代码来接受LevelSystem;仍然不起作用 – Gasim

+0

我通过将其作为单独的参数传递来解决此问题:'template inline Handler MemFn(Func && f,Sys * system){...}' – Gasim

回答

5

您正在尝试创建一个绑定表达式,该对象将在System对象上调用bool (LevelSystem::*)(Event*)函数,这是不可能的。

您需要正确的动态类型的this绑定的功能,为您的评论表示您现在已经由this指针传递给MemFn完成。

如果你总是将一个指向成员函数的指针传递给MemFn,那么通过rvalue-reference传递它就没有意义了,你可能只是传递指向成员的指针。这样做,可以让你推断类的类型,这样,那么你可以施放this该类型:

template<typename Ret, typename Class, typename Param> 
    inline Handler MemFn(Ret (Class::*f)(Param)) { 
    return std::bind(f, static_cast<Class*>(this), std::placeholders::_1); 
    } 
+0

谢谢! C++让我越来越惊奇:)但有一件事。不应该是'static_cast (this)' – Gasim

+0

糟糕,是的,这是一个错字 - 现在修复,谢谢 –