1

부스트 신호를 사용하는이 C++ 코드를 발견했으며이를 이해하려고합니다.부스트 신호 - 매개 변수로 전달 된 유형

// A boost::signal wrapper structure 
template <typename Signature> 
struct SignalBase : public boost::noncopyable 
{ 
    typedef boost::function_traits<Signature>  SignatureTraits; 

    typedef boost::signal<Signature>     SignalType; 
    typedef typename SignalType::slot_function_type SlotFunctionType; 
    typedef typename SignalType::result_type   ResultType; 
    typedef boost::signals::connection     ConnectionType; 

    SignalBase() : m_signal() {}; 
    virtual ~SignalBase() {}; 

protected: 
    SignalType m_signal; 
}; 


// I use a specialization of this template for an arity of 1. 
// The template generates the correct function call operator for the arity of the signal. 
template<int Arity, typename Signature> 
struct SelArity : public SignalBase<Signature> {}; 

// Specialization 
template<typename Signature> 
struct SelArity< 1, Signature> : public SignalBase<Signature> 
{ 
    typedef SignalBase<Signature> BaseType; 
    inline typename BaseType::ResultType operator()(typename BaseType::SignatureTraits::arg1_type arg) 
    { 
     return BaseType::m_signal(arg); 
    } 
}; 

펑터가 무엇을 반환할지 알 수 없습니다. 내가 이해하는 한, m_signalSignature 서명으로 함수에 연결할 수있는 신호를 선언 할 수있는 유형입니다. 유형을 매개 변수로 사용하는 것이 가능한가? (return BaseType::m_signal(arg); 참조) ResultType으로 표시되는 유형은 무엇입니까? 그리고 어떻게 functor에 의해 반환 된 객체 SelArity을 사용할 수 있습니까?

답변

1

아니요, m_signal은 유형이 아니며 SignalType의 인스턴스입니다 (boost::signal<Signature>).

SelArity functor는 실제로 1 인수를 사용하여 m_signal을 호출하고 그 반환 값을 반환합니다.

(이 래퍼가 필요한 것은 무엇입니까?)

+0

무엇에 대해'arg'? arg도 인스턴스예요? 또한 나는 boost 문서를 읽고'SignalType'이 맞으면 (Signature가'void (float)'와 같은 경우) 신호 객체를 호출 할 때 어떤 매개 변수도 필요하지 않습니다.
'sig (5);'
그래서'SignalType' 객체를 리턴해야 할 필요가 있습니다. (이것은' m_signal') 하나의 매개 변수? 이 예제에서는'm_signal'을'sig'로 번역하지 않습니까? 그렇다면'm_signal'을 인자로 호출해야하는 이유는 무엇입니까? –

+1

@ 존 스미스 1) 예,'arg'는 (BaseType :: SignatureTraits :: arg1_type' 타입의) 인자입니다. 2) 시그널의 시그니처가'void (float)'이면, 호출자는'sig (5.0)'이라는 하나의 인수로 호출해야합니다. 3) 펑터는 신호 객체를 반환하지 않으며, * 그것을 호출하고 반환 값을 반환합니다 (문서의 "결합 자"참조). 4) 가장 마지막이 아니지만 : C++ 기초에 대한 책을 읽는 것이 좋습니다! 고급 주제를 이해하는 것이 중요합니다. –