Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果其中一个返回true,是否有方法阻止boost::signal调用其插槽?_C++_Signals Slots_Boost Signals - Fatal编程技术网

C++ 如果其中一个返回true,是否有方法阻止boost::signal调用其插槽?

C++ 如果其中一个返回true,是否有方法阻止boost::signal调用其插槽?,c++,signals-slots,boost-signals,C++,Signals Slots,Boost Signals,我正在使用boost库,我的问题是关于boost::signals的。 我有一个信号可能会呼叫许多不同的插槽,但只有一个插槽与呼叫匹配,因此我希望此特定插槽返回true,并且呼叫将停止。 可能吗? 效率高吗? 如果效率不高,你们能给我一个更好的建议吗 虽然这是可能的,但肯定与信号和插槽的“通用发布/订阅”意图相反 我认为您真正想要的是设计模式。正如Drew所说,这听起来不适合信号和插槽 正如dribeas所说,解决方案是一个协议,其中包含一个bool&found参数,该参数以false开头,每个

我正在使用boost库,我的问题是关于boost::signals的。
我有一个信号可能会呼叫许多不同的插槽,但只有一个插槽与呼叫匹配,因此我希望此特定插槽返回true,并且呼叫将停止。
可能吗?
效率高吗?

如果效率不高,你们能给我一个更好的建议吗

虽然这是可能的,但肯定与信号和插槽的“通用发布/订阅”意图相反


我认为您真正想要的是设计模式。

正如Drew所说,这听起来不适合信号和插槽

正如dribeas所说,解决方案是一个协议,其中包含一个
bool&found
参数,该参数以false开头,每个插槽在开始时进行检查,如果为true则返回。如果任何插槽将该值设置为true,那么其他调用的处理将非常快

但是为了涵盖所有的基础(甚至是不可取的基础),我要提到的是,由于boost::signals是一个函数,您可以从信号中抛出一个自定义异常,然后在调用站点捕获它。不管是好是坏,当人们觉得没有其他选择时,偶尔会求助于此……比如在boost graph库中的访客算法期间:

现在我已经提到了,不要那样做

更新:不知道,但您发现boost有一种机制,可以通过使用迭代器而不是结果值的组合器优雅地处理此问题:

“传递给组合器的输入迭代器将解引用操作转换为插槽调用。因此,组合器可以选择仅调用某些插槽,直到满足某些特定条件。”


如果你确定你坚持使用boost,那么你已经回答了你自己的问题,因为这正是你想要的。不过请注意,其他信号/插槽系统(如Qt)将不会有与此类似的功能…

经过一些研究,我发现它们在boost文档中提到过。
他们建议使用不同的组合器,如下所示:

struct breakIfTrue
{
  template<typename InputIterator>
  bool operator()(InputIterator first, InputIterator last) const
  {
    if (first == last)
      return false;

    while (first != last) {
      if (*first)
        return true;
      ++first;
    }
  }
};

boost::signal<bool(), breakIfTrue> sig;
struct breakfiftrue
{
模板
布尔运算符()(先输入位,后输入位)常量
{
如果(第一个==最后一个)
返回false;
while(第一个!=最后一个){
如果(*第一个)
返回true;
++第一,;
}
}
};
boost::信号sig;

为什么这样做是错误的?

您指的是哪种语言?你问题的内容并没有泄露。我认为在标签中提到我提到的boost就足够了。听起来你所做的不应该用信号/插槽来完成。Think combiners运行了所有这些,但在检查文档时,它说:“因此,组合器可以选择只调用一些插槽,直到满足某个特定的标准。”鉴于此,听起来您已经找到了答案!但我要指出的是,这似乎是boost信号/插槽机制的一个独特属性,您不必在其他系统(如Qt)中找到它+1,我已经使用信号好几年了,但在文档中从未发现过。做得好。我在标签上声明它与boost相关。编辑这篇文章以确保每个人都理解我说的是boost。我的问题是,这样做有什么问题吗?D'oh:)我一直在尝试使标签正交,以便你在[boost]和[signals slot]上使用AND搜索,而不是在boost信号slot上使用AND搜索,例如,组合器w/迭代器模式显然在boost中得到认可,并且在signals和signals2中都是可能的,因此如果您确定没有从boost切换,我会说使用它。