Templated + = перегрузка оператора с присваиванием std :: pair - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь построить сигнал / слот в 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!!
}

Myвопрос в том, как я могу заставить его работать только с {} на стороне пользователя?Большое спасибо!

1 Ответ

1 голос
/ 10 июня 2019

Это работает, если вы добавляете конкретную перегрузку функции, которая не является шаблонной:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...