Вектор std :: function с переменной Number of Arguments - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу сохранить event_handler в std :: vector, затем я сохраню std::vector в map В соответствии с ключом карты я вызову listeners[index].handler_(args...) с другими аргументами.

Я понимаю, что вышеупомянутое не возможно, потому что std :: vector не может хранить различные типы; но мне интересно, есть ли альтернативы, которые я должен рассмотреть.

template<class... Args>
using Handler = std::function<void(Args &&... args)>;

template<typename T>
struct event_handler  {
    event_handler(Handler<T> handler, bool once) : handler_(std::move(handler)), once_(once) {}

    Handler<T> handler_;
    bool once_;
};

std::vector<event_handler> listeners; // I known this line is wrong, here is just for example

1 Ответ

0 голосов
/ 17 февраля 2020

Вы должны отделить значения, которые вы хотите передать функциям обработки событий, от ваших event_handler (возможно, ни одного / нуля) и тех значений, которые приложение / пользователь event_handler хочет передать.

Первый, который вы определяете как параметры в вашем std::function типе, этот список параметров, конечно, должен быть одинаковым для всех функций.
Последний связан с вызовами функций, когда функция передается вашему обработчику событий, использование std::bind().

Имейте в виду, что это решение несет риск того, что пользователь вашей библиотеки связывает указатели или ссылки на переменные / объекты, которые больше не существуют, когда выполняется обработчик.

...