提升信号 - 作为参数传递的类型

时间:2013-02-02 20:06:13

标签: c++ boost metaprogramming template-meta-programming boost-signals

我发现这个使用增强信号的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仿函数返回的对象?

1 个答案:

答案 0 :(得分:1)

不,m_signal不是类型,它是类SignalType的实例,即boost::signal<Signature>

SelArity仿函数实际上使用1个参数调用m_signal并返回其返回值。

(我不知道所需的所有包装物。)