【问题标题】:Specifying alternate defaults for boost signals2为升压信号指定备用默认值2
【发布时间】:2012-06-21 03:39:08
【问题描述】:

Boost 的 signals2 库定义了一种很好的方式来传递一些扩展功能的备用参数(通过它的参数库)。当这些备用参数之一在我的代码中相当普遍时,我想制作一个帮助程序来进一步简化使用;例如,要指定一个备用互斥体类型,我可以这样做:

namespace bs2 = boost::signals2;
template<typename Signature>
struct my_signal
{
    typedef typename bs2::signal_type<Signature,
        bs2::keywords::mutex_type<my_mutex> >::type type;
};

my_signal<void ()>::type some_signal;

不幸的是,这样做我也“失去”了为其他信号参数(例如组合器类型)指定替代值的能力,而无需回到冗长的语法或定义额外的元函数,例如 my_signal_with_combiner 或其他东西(看起来很傻)。我认为我不能使用默认模板参数值来做到这一点,因为 Combiner 的默认值需要拆分 Signature 才能获得返回类型。 (当然,理想情况下,我想要适用于任何其他参数的东西,而不仅仅是组合器。)

所以,“真正的”问题是:是否有一种(简单的)方法来定义类似 signal_type 的东西,它的行为与其相同,但其中一个参数具有不同的默认值? (理想情况下,如果 Boost.Signals2 将来添加更多参数,则不需要更改。)

(另外,请不要使用 C++11。仍在使用较旧的编译器。)

【问题讨论】:

    标签: c++ templates boost boost-signals2 boost-parameter


    【解决方案1】:

    我已经解决了以下问题,这似乎可以解决问题。不过,仍然对改进的答案感兴趣:

    namespace bs2 = boost::signals2;
    
    template <
        typename Signature,
        typename A1 = boost::parameter::void_,
        typename A2 = boost::parameter::void_,
        typename A3 = boost::parameter::void_,
        typename A4 = boost::parameter::void_,
        typename A5 = boost::parameter::void_,
        typename A6 = boost::parameter::void_
      >
    struct my_signal_type : public bs2::signal_type<Signature, A1, A2, A3, A4, A5, A6>
    {
        typedef typename boost::parameter::value_type<args, bs2::keywords::tag::mutex_type, my_mutex>::type mutex_type;
    
        typedef bs2::signal<
            signature_type,
            combiner_type,
            group_type,
            group_compare_type,
            slot_function_type,
            extended_slot_function_type,
            mutex_type
        > type;
    };
    
    template <
        typename Signature,
        typename A1 = boost::parameter::void_,
        typename A2 = boost::parameter::void_,
        typename A3 = boost::parameter::void_,
        typename A4 = boost::parameter::void_,
        typename A5 = boost::parameter::void_,
        typename A6 = boost::parameter::void_
      >
    class MyEvent : public my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type
    {
    public:
        typedef typename my_signal_type<Signature, A1, A2, A3, A4, A5, A6>::type base_type;
    
        explicit MyEvent(const typename base_type::combiner_type& combiner = combiner_type())
            : base_type(combiner)
        {
        }
    };
    

    让我有点困惑的一点是,为什么在构造函数中使用“combiner_type”需要在类型声明中明确定义范围——然后它不需要默认参数。 (在此处删除“typename”或“base_type::”会触发标准的“default-int”错误(这意味着“这看起来不像我知道的类型”)。这很奇怪,因为它是在基类中定义的. 我猜这是一些奇怪的模板部分实例化的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多