模板化 += 运算符重载与 std::p air 分配

Templated += operator overloading with std::pair assignment

本文关键字:std air 分配 重载 运算符      更新时间:2023-10-16

我正在尝试在 C++ 11 中构建一个信号/插槽,我想通过 += 运算符使用"连接"函数,但由于 += 运算符只能接受一个参数,并且为了获取可调用的成员函数,我还需要对象指针。

因此,我必须使参数成为标准对代码如下:

#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!!
}

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

如果您添加未模板化的特定函数重载,它就会起作用:

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