2010-01-05 2 views
2

내가 부스트 라이브러리를 사용하고 내 질문에 대한 boost :: signals 있습니다.
여러 슬롯을 호출 할 수있는 신호가 있지만 슬롯 하나만이 통화와 일치하므로이 특정 슬롯이 true를 반환하고 통화가 중단되기를 원합니다.
가능합니까?
효율적인가요?
효율성이 떨어지면 나에게 더 나은 방법을 제안 해 줄 수 있습니까?부울 :: 신호 중 하나가 true를 반환하는 경우 해당 슬롯을 호출하는 것을 막을 수있는 방법이 있습니까?

+0

어떤 언어를 사용하고 있습니까? 귀하의 질문 내용은 그것을 포기하지 않습니다. –

+0

태그를 언급하면서 내가 부스트를 추천한다고 생각했습니다. –

+0

신호/슬롯을 사용해서는 안되는 것처럼 들립니다. –

답변

6

약간의 연구 끝에 나는 부스트 문서에서 그들이 Slots that return values에 대해 쓰는 것을 발견했습니다. 이제

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; 

왜 잘못된 일을 할 수 있는지 :
그들은이 같은 다른 결합기를 사용하는 것이 좋습니다?

+0

+1 : 이것은 정답입니다. –

+0

이 방법에 문제가 있습니까? –

+1

사상가 결합 자들은 모두 그것들을 돌렸지 만, 문서를 조사 할 때 "Combiners는 특정 기준이 충족 될 때까지 일부 슬롯 만 호출 할 수있는 옵션이 있습니다." 그것을 감안할 때, 당신은 대답을 가지고있는 것처럼 들리 네! 하지만 이것은 boost 신호/슬롯 메커니즘의 고유 한 속성처럼 보일 것이며 Qt와 같은 다른 시스템에서 반드시 발견 할 수는 없다는 것을 지적 할 것입니다. – HostileFork

3

가능할 수도 있지만, 확실하게 신호 & 슬롯의 "일반 게시/구독"의도와 반대입니다.

당신이 정말로 찾고있는 것은 Chain of Responsibility 디자인 패턴입니다.

2

드류 (Drew)가 말했듯이 이것은 신호와 슬롯에 적합하지 않은 것으로 들립니다.

dribe가 말한 것처럼 해결 방법은 거짓으로 시작하는 bool& found 매개 변수가있는 프로토콜입니다. 시작시 모든 슬롯을 확인한 후 true로 설정하면이를 반환합니다. 슬롯이 값을 true로 설정하면 다른 호출의 처리가 매우 빠르게 수행됩니다.

그러나 단지 모든 기반 (도 권할 것)을 충당하기 위해, 내가 부스트 : : 신호가 all run on the same thread as the caller 때문에 그건 당신이 다음, 신호 내에서 사용자 정의 예외를 호출 사이트에서 그것을 잡을 수 말할 수 있습니다 . 내가 돈을 언급 한 것을 지금

How do I stop the breadth-first search using Boost Graph Library when using a custom visitor?

: 그리고 그들은 다른 선택이 없다 느낄 때 더 낫거나 더 나쁜을 위해, 사람들은 때때로 부스트 그래프 라이브러리의 방문자 알고리즘 동안 같은 ...이 리조트 그렇게하지 마라. :)

는 UPDATE : 그것을 몰랐하지만 당신은 그 부스트 우아 반복자을 가지고 값을 초래하지 컴과 함께이 문제를 처리하기위한 메커니즘이 발견에 전달

"입력 반복자를 결합 자 (combiner)는 역 호출 (dereference) 동작을 슬롯 호출로 변환한다. 따라서 조합자는 일부 특정 기준이 충족 될 때까지 일부 슬롯 만 호출 할 수있다. "

당신이 부스트를 고수하고 있다면 확실한 질문에 답했습니다. 비록 다른 신호/슬롯 시스템 (Qt 같은)은 이것과 평행을 이루지는 않을 것이지만 ...

+0

나는 그것이 부스트와 관련 있다고 태그에 언급했다. 게시물을 편집하여 모두가 내가 부스트에 대해 말하고 있음을 이해할 수 있도록했습니다. 제 질문은 이런 일을하는 데 문제가 있습니까? –

+0

D' oh :) 나는 부스트 시그널 슬롯 대신에 [boost]와 [signals-slots]에 AND 검색을 사용할 수 있도록 태그를 직각으로 만들려고 노력했다. 예를 들어 http : //를 보라. meta.stackexchange.com/questions/34740/when-to-use-hyphenated-taga-tagb-instead-of-searching-taga-and-tagb – HostileFork

+0

반복자 결합 자 패턴은 명백하게 후원에서 승인되며 두 가지 모두에서 가능합니다. 신호 및 signals2, 그래서 당신이 부스트에서 전환하지 않는 것이 확실하다면 그것과 함께 말할 것입니다. – HostileFork

관련 문제