Функция TR1 многоадресная - PullRequest
0 голосов
/ 25 октября 2011

Как бы вы реализовали многоадресную передачу для функторов TR1? У меня есть слоты для обратного вызова, реализованные как

void setCallback(std::tr1::function<void (std::string)> cb)
{
    this->callback = cb;
}

но нужно передать более одного обратного вызова в одном из них. Я не хочу вдаваться в более сложные решения, такие как наблюдатель, так как это единственный случай, когда мне нужна многоадресная рассылка. Я также не могу использовать Boost.Signals (как предложено здесь ), потому что я не могу использовать Boost. Мне не нужно явно обрабатывать отключение обратного вызова, когда абонент больше не существует.

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Скорее всего, вы хотите:

void registerCallback(std::tr1::function<void (std::string)> cb)
{
    this->callbacks.push_back(cb);
}

с callbacks контейнером (в зависимости от того, что вам нравится) из std::tr1::function объектов вместо одного. При отправке перебирайте обратные вызовы.

Кроме того, если вы хотите иметь возможность удалять обратные вызовы позже, вы можете сделать что-то вроде этого:

// I use list because I don't want the iterators to be invalid
// after I add / remove elements
std::list<std::function<void(std::string)>> callbacks;

...
typedef std::list<std::function<void(std::string)>>::iterator callback_id;

callback_id register_callback(std::function<void(std::string)> f)
{
    return callbacks.insert(callbacks.end(), f);
}

void unregister_callback(callback_id id)
{
    callbacks.erase(id);
}
0 голосов
/ 25 октября 2011

Поместите их в список / вектор. Если вам нужно удалить их по отдельности, вам нужно как-то обернуть их (потому что они несопоставимы).

0 голосов
/ 25 октября 2011

Иметь их последовательность, а не одну функцию (т. Е. vector<...>), и при обратном вызове повторять последовательность и вызывать.

Например,

std::vector<std::tr1::function<void (std::string)> > callbacks;
auto it = callbacks.begin(), end = callbacks.end();
for(; it != end; ++it)
  (*it)("somestring");
...