簡體   English   中英

如何圍繞 std::bind 創建包裝器

[英]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指針傳遞給MemFnMemFn

如果您總是要將指向成員函數的指針傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM