2012-08-03 4 views
1

특정 서명을 요구하는 Boost :: Signal에 다른 서명을 가진 함수를 연결할 수 있습니까?일반 함수/슬롯을 사용하여 boost :: 신호에 연결하는 방법은 무엇입니까?

나는 다양한 시그널을 가지고있다. 그리고 시그널의 시그니처를 신경 쓰지 않고 시그널을 관찰 할 수 있기를 원한다. 심지어 가능할까요?

예 :

float sum(float x, float y) 
{ 
    return x + y; 
} 

void signal_monitor(void) 
{ 
    //Do something 
} 

boost::signal<float (float, float)> sig; 

sig.connect(&print_sum); 
sig.connect(/* How to connect to signal_monitor ? */); 

sig(5, 3); 

그것을 할 부스트 : : 바인딩을 사용할 수 있습니까? 사용

부스트 버전 :

opt/include/boost/function/function_template.hpp: In static member function ‘static R boost::detail::function::function_obj_invoker2<FunctionObj, R, T0, T1>::invoke(boost::detail::function::function_buffer&, T0, T1) [with FunctionObj = float, R = float, T0 = float, T1 = float]’: 
opt/include/boost/function/function_template.hpp:913:60: instantiated from ‘void boost::function2<R, T1, T2>::assign_to(Functor) [with Functor = float, R = float, T0 = float, T1 = float]’ 
opt/include/boost/function/function_template.hpp:722:7: instantiated from ‘boost::function2<R, T1, T2>::function2(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = float, R = float, T0 = float, T1 = float, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’ 
opt/include/boost/function/function_template.hpp:1064:16: instantiated from ‘boost::function<R(T0, T1)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = float, R = float, T0 = float, T1 = float, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’ 
opt/include/boost/function/function_template.hpp:1105:5: instantiated from ‘typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1)>&>::type boost::function<R(T0, T1)>::operator=(Functor) [with Functor = float, R = float, T0 = float, T1 = float, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1)>&>::type = boost::function<float(float, float)>&]’ 
opt/include/boost/signals2/detail/slot_template.hpp:156:9: instantiated from ‘void boost::signals2::slot2<R, T1, T2, SlotFunction>::init_slot_function(const F&) [with F = float, R = float, T1 = float, T2 = float, SlotFunction = boost::function<float(float, float)>]’ 
opt/include/boost/signals2/detail/slot_template.hpp:81:9: instantiated from ‘boost::signals2::slot2<R, T1, T2, SlotFunction>::slot2(const F&) [with F = float, R = float, T1 = float, T2 = float, SlotFunction = boost::function<float(float, float)>]’ 
../../../example/example.cpp:200:61: instantiated from here 
opt/include/boost/function/function_template.hpp:132:42: error: ‘* f’ cannot be used as a function 
opt/include/boost/function/function_template.hpp:133:9: error: control reaches end of non-void function [-Werror=return-type] 
cc1plus: all warnings being treated as errors 
make[1]: *** [example.o] Error 1 

많은 감사들 : 나는

sig.connect((boost::phoenix::bind(&signal_monitor), 1.f)); // Return 1.f 

를 사용하는 경우 1.46.1

나는 다음과 같은 오류를 얻을.

답변

1

Yes (예) :

sig.connect(boost::bind(&signal_monitor)); 

바인드 단순히 인수를 전달하지 않습니다. 편집이

: 루크에 의해 언급 한 바와 같이이 아무것도 반환하지 인해 바인드 식으로 작동하지 않습니다는 아마도 단지 바인드를 밀어 사용하여 다른 해결 방법이 있습니다,하지만 또 다른 큰 총, boost::phoenix (#include "boost/phoenix.hpp"를) 이끌어하는 것입니다

sig.connect((boost::phoenix::bind(&signal_monitor), 1.f)); // Return 1.f 

추가 ()에 주목하십시오. 그렇지 않으면 여전히 매개 변수를 connect으로 전달 중입니다.

+0

반환 유형과 값의 문제가 있습니다. –

+0

빠른 응답 주셔서 감사합니다, 나는 컴파일 오류가 발생합니다. 만약 내가 전화를 sig.connect ((부스트 :: phoenix :: bind (& signal_monitor), 1.f)); "boost"/ function/function_template.hpp : 132 : 42 : 오류 : '* f'를 함수로 사용할 수 없습니다. " – Sak

+0

@ user1574205 제공된 예제 (예 : 1.f를 반환하고 모든 오류는 criptic입니다. 일할 수 있으므로 더 많은 정보를 제공해야합니다. 예 : 오류 출력에 대한 링크와 사용중인 Boost 버전이 많은 도움이 될 것입니다. –

0

float를 반환하는 함수 대신 void를 반환하는 함수를 사용하는 것이 금지되어 있습니다. 반환 값이 실제로 무언가에 사용되면 값이 정의되지 않으므로 프로그램의 동작이 예측할 수 없게 될 수 있습니다.

그래서 당신이하려는 일을하는 유일한 방법은 올바른 서명으로 새 함수를 만든 다음 그 함수를 단순히 void 함수를 호출하고 0을 반환하는 것입니다. C++ 11, 나는 이것이 작동한다고 생각 :

sig.connect([](float, float)->float { signal_monitor(); return 0.0f; });