带有+ std :: pair分配的模板化+ =运算符重载

时间:2019-06-10 11:50:29

标签: c++ templates

我正在尝试在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!!
}

我的问题是,如何使它仅在用户端使用{}? 非常感谢!

1 个答案:

答案 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);