TR1功能组播

时间:2011-10-25 09:59:35

标签: c++ functor tr1

如何为TR1仿函数实现多播?我的回调插槽实现像

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

但需要在其中一个中传递多个回调。我不想进入像观察者这样的更复杂的解决方案,因为这是迄今为止我需要多播的唯一情况。我也不能使用Boost.Signals(如建议here),因为我不能使用Boost。当订户不再存在时,我不需要显式处理禁用回调。

3 个答案:

答案 0 :(得分:3)

你最想要的是:

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

答案 1 :(得分:0)

有一个序列而不是单个函数(即vector<...>),并在回调时,迭代序列并调用。

e.g

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

答案 2 :(得分:0)

将它们放在列表/向量中。如果你必须单独删除它们,你必须将它们包装起来(因为它们不具有可比性)。