首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TR1功能组播

TR1功能组播
EN

Stack Overflow用户
提问于 2011-10-25 17:59:35
回答 3查看 647关注 0票数 0

您将如何为TR1函数器实现多播?我的回调槽实现如下

代码语言:javascript
复制
void setCallback(std::tr1::function<void (std::string)> cb)
{
    this->callback = cb;
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-25 18:14:16

您最可能需要的是:

代码语言:javascript
复制
void registerCallback(std::tr1::function<void (std::string)> cb)
{
    this->callbacks.push_back(cb);
}

使用callbacks,是std::tr1::function对象的容器(无论您喜欢什么),而不是单个对象。调度时,遍历回调函数。

此外,如果您希望以后能够删除回调,您可以按照以下方式进行操作:

代码语言:javascript
复制
// 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);
}
票数 3
EN

Stack Overflow用户

发布于 2011-10-25 18:05:51

使用它们的序列,而不是单个函数(即vector<...>),并且在回调时,迭代序列并调用。

e.g

代码语言:javascript
复制
std::vector<std::tr1::function<void (std::string)> > callbacks;
auto it = callbacks.begin(), end = callbacks.end();
for(; it != end; ++it)
  (*it)("somestring");
票数 0
EN

Stack Overflow用户

发布于 2011-10-25 18:06:27

将它们放入列表/向量中。如果必须单独删除它们,则必须对它们进行包装(因为它们不具有可比性)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7887582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档