指定升压信号的备用默认值2

Specifying alternate defaults for boost signals2

本文关键字:备用 默认值 信号      更新时间:2023-10-16

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 的默认值需要分解签名才能获得返回类型。 (理想情况下,我当然想要适用于任何其他参数的东西,而不仅仅是组合器。

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

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

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

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"错误(这意味着"这看起来不像我知道的类型")。 这很奇怪,因为它是在基类中定义的。 我猜这是一些奇怪的模板部分实例化的东西。