1

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

例子:

 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< sizeof...(REST), C<REST...>, Empty >表达式。

问题是,我不能使用

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<REST...>也会失败。

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

4

1 回答 1

3

您可以通过创建一个别名模板来稍微缩短重复,这里称为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);
};
于 2021-11-16T19:26:41.647 回答