如何从自身递归继承模板class? (不是 CRTP!)

How to recursively inherit a template class from itself? (not CRTP!)

我要尝试一个有趣的把戏! 我想递归地构建模板的继承 classes.

我期待看到这个:

T<int, int, int> inherits T<int,int> inherits T<int> inherits T<void>
/*Here should be specializations with void...*/

template<typename T, typename... Ts>
class ToPack : ToPack<Ts...>
{
public:
    ToPack(T t, Ts... ts) : ToPack(ts...) {}
};

template<typename T>
class ToPack<T, void> {};

 int main(void)
{
     ToPack<int, int, int> t(1, 2, 3);
}

但问题在于,当编译器尝试实例化 T<int> 时,它会尝试为“parent”class 解压可变模板参数,但失败了,即

ToPack<int> -> actually ToPack<int, void> that tries to unpack ToPack<void...>

这个问题可以解决吗?

如评论中所述,void本身就是一种类型,而不是空的占位符。你真正拥有的是 ToPack<int, int, int> -> ToPack<int, int> -> ToPack<int> -> ToPack<>ToPack<> 无效,因为它至少需要一个模板参数,因此无法编译。

您需要通过专注于一个模板参数来更改您的基本情况:

template <typename T, typename... Ts>
class ToPack : ToPack<Ts...> {
public:
    ToPack(T t, Ts... ts) : ToPack<Ts...>(ts...) {}
};

template <typename T>
class ToPack<T> {
public:
    ToPack(T t) {}
};