【问题标题】:default template argument and parameter pack默认模板参数和参数包
【发布时间】:2021-12-27 20:53:38
【问题描述】:

在经典的递归模板特化中,我需要在类定义中多次使用一种类型,例如用于继承和使用语句,也可能在其他地方。

例子:

 template < typename ... T > 
class C;

template < typename FIRST, typename ... REST>
class C< FIRST, REST...>: public std::conditional_t< sizeof...(REST), C<REST...>, Empty >
{
    public:
    using std::conditional_t< sizeof...(REST), C<REST...>, Empty >::Set;
    void Set( FIRST );
};

如您所见,我需要多次编写std::conditional_t&lt; sizeof...(REST), C&lt;REST...&gt;, Empty &gt; 表达式。

问题是,我也不能使用

template < typename ... T >
class C;

template < typename FIRST, typename ... REST, typename INHERIT = std::conditional_t< sizeof...(REST), C<REST...>, Empty >>
class C< FIRST, REST...>: public INHERIT
{
    using INHERIT::Set;
};

失败,因为 C++ 不允许在特化中使用默认模板参数

也没有

template < typename ... T, typename INHERIT = std::conditional_t< sizeof...(REST), C<REST...>, Empty >  >
class C;

...

失败,因为我不能在参数包后面使用默认模板参数。即使允许这样做,C 类还没有定义,因为这个C&lt;REST...&gt; 也会失败。

有什么技巧可以避免多次定义std::conditional_t&lt; sizeof...(REST), C&lt;REST...&gt;, Empty &gt; 语句吗?

【问题讨论】:

    标签: c++ parameter-pack default-template-argument


    【解决方案1】:

    您可以通过创建别名模板(此处称为mybase)稍微缩短重复:

    template <class... REST>
    using mybase = std::conditional_t<sizeof...(REST), C<REST...>, Empty>;
    
    template <typename FIRST, typename... REST>
    class C<FIRST, REST...> : public mybase<REST...> {
    public:
        using mybase<REST...>::Set;
        void Set(FIRST);
    };
    

    【讨论】:

    • 谢谢!接得好!但在我的真实世界代码中,参数列表稍长……有什么建议吗?
    • @Klaus 我想我必须先看看它,然后再试一试。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多