我正在寫一個小信號/ slot類。調度函數接收一個類的實例和一個指向實例類型成員的指針,並將其存儲在std::function
中,並將實例指針綁定到第一個參數std::bind
以提供this
指針。我的主要問題是我誤解了C++的規則,還是我的編譯器沒有按預期行事。在指向成員函數簽名的指針中缺少「this」指針
template <class Signal, class ... ArgTs>
class SignalDispatcher {
//...
template <class Class>
void dispatch(const Signal& signal, Class* target, void (Class::*slot)(Class*, ArgTs...));
//...
};
然後如果我叫調度帶有參數的函數,像這樣
SomeStruct instance;
SignalDispatcher<int, some_type> dispatcher;
dispatcher.dispatch(1, &instance, &SomeStruct::member_function);
我的編譯器說,通過成員函數簽名
void (Class::*)(ArgTs...)
,而不是預期的
void (Class::*)(Class*, ArgTs...)
反過來導致類型不匹配和編譯失敗。
我的編譯器是g ++ 6.3.0
除非你聲明的功能,使得它的第一個參數是指向某種類型的,沒有理由指望你期待什麼。 – skypjack
要獲得第一個參數作爲'this'指針,請使用'std :: mem_fn' –