【问题标题】:Boost signals - type passed as parameter升压信号 - 作为参数传递的类型
【发布时间】:2013-02-02 20:06:12
【问题描述】:

我发现了这个使用升压信号的 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 functor 返回的对象?

【问题讨论】:

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


    【解决方案1】:

    不,m_signal 不是类型,它是类SignalType 的实例,即boost::signal&lt;Signature&gt;

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

    (我不知道所有这些包装器需要什么。)

    【讨论】:

    • arg 呢? arg 也是一个实例吗?我还阅读了 boost 文档,如果 SignalType 是正确的(如果 Signature 是例如 void(float) )调用信号对象将不需要任何参数,例如
      boost::signal&lt;void (float)&gt; sig;
      sig.connect(&amp;print);sig(5);
      那么为什么我需要返回一个带有一个参数的SignalType 对象(即m_signal)? m_signal 在这个例子中不是翻译成sig 吗?那么为什么要使用参数调用m_signal
    • @John Smith 1) 是的,arg 是参数(BaseType::SignatureTraits::arg1_type 类型)。 2) 如果信号的签名是void(float),调用者必须用一个参数调用它:sig(5.0)。 3) 函子不返回信号对象,它调用它,并返回它的返回值(参见文档中的“组合器”)。 4)最后但并非最不重要的一点:我强烈推荐你阅读一本关于 C++ 基础的书!了解更高级的主题至关重要。
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多