在经典的递归模板特化中,我需要在类定义中多次使用一种类型,例如用于继承和使用语句,也可能在其他地方。
例子:
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 >
语句吗?