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 );
    }
};

どのSelArityファンクターが返されるのかわかりません。私が理解している限り、署名付きのm_signal関数に接続できるシグナルを宣言できるタイプです。Signatureどのようにして型をパラメーターとして持つことができますか?( を参照return BaseType::m_signal( arg );) によって表される型は何ResultTypeですか? SelArityそして、ファンクターによって返されたオブジェクトをどのように使用できますか?

4

1 に答える 1

1

いいえ、m_signal型ではありません。これは class のインスタンスです。SignalTypeこれはboost::signal<Signature>です。

SelArityfunctor は実際にはm_signal1 つの引数で呼び出し、その戻り値を返します。

(これらすべてのラッパーが必要な理由はわかりません。)

于 2013-02-02T21:42:12.653 に答える