我正在写一个小信号/ 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' –