[英]how to create wrapper around std::bind
我有一個函數對象typedef std::function<bool(Event*)> Handler
。 成員函數總是被分配給這個對象。 所以,我使用std::bind
來實現這一點。
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 *)>')
我不明白這個錯誤。
您正在嘗試創建一個綁定表達式,該表達式將在System
對象上調用bool (LevelSystem::*)(Event*)
函數,這是不可能的。
您需要將this
的正確動態類型綁定到函數,因為您的注釋表明您現在已經通過將this
指針傳遞給MemFn
來MemFn
。
如果您總是要將指向成員函數的指針傳遞給MemFn
那么通過右值引用傳遞它是沒有意義的,您不妨只傳遞指向成員的指針。 這樣做,可以讓你推斷類的類型,所以你可以再投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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.