我正在尝试在C ++ 11中构建信号/插槽,我想让+ =运算符使用“ connect”函数,但是由于+ =运算符只能采用单个参数,因此接受一个可调用的成员函数,我也需要对象指针。
因此,我必须将参数设为标准对 代码如下:
#include <iostream>
class listener{
public:
void on_event(){ /* ... */ }
};
class event{
public:
template<typename T, typename F = void(T::*)()>
void operator+=( std::pair<T*, F> p ){
/* ... */
}
};
int main (int argc, char *argv[]) {
event e;
listener l;
e += std::pair(&l, &listener::on_event); // works
e += std::make_pair(&l, &listener::on_event); // works
e += {&l, &listener::on_event}; // NOT works!!
}
我的问题是,如何使它仅在用户端使用{}? 非常感谢!
答案 0 :(得分:1)
如果您添加未模板化的特定函数重载,它将起作用:
void operator+=(std::pair<listener*, void(listener::*)()> p) {
// Delegate to the other one (But prevent infinite
// recursion by specifying it's the template one)
operator+=<listener>(p);
}
e += {&l, &listener::on_event};
但这仅适用于listener
个对象。我建议创建一个带有2个参数的成员函数:
template<typename T, typename F>
void add(T& object, F&& method) {
operator+=(std::pair<T*, F>(std::addressof(object), std::forward<F>(method)));
}
e.add(l, &listener::on_event);