【问题标题】:How to recursively inherit a template class from itself? (not CRTP!)如何从自身递归继承模板类? (不是 CRTP!)
【发布时间】:2021-05-16 13:31:21
【问题描述】:

我要尝试一个有趣的技巧! 我想递归地构建模板类的继承。

我期待看到这个:

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&lt;int&gt; 时,它会尝试为“父”类解压缩可变参数模板参数,但它失败了,即

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

这个问题能解决吗?

【问题讨论】:

  • s/T&lt;void&gt;/T&lt;&gt;? - void 实际上是一个类型,而不是没有类型的占位符。它不在包中,因此扩展不会以它结束。

标签: c++ templates metaprogramming template-meta-programming


【解决方案1】:

正如 cmets 中提到的,void 本身就是一种类型,而不是空的占位符。你真正拥有的是ToPack&lt;int, int, int&gt; -> ToPack&lt;int, int&gt; -> ToPack&lt;int&gt; -> ToPack&lt;&gt;ToPack&lt;&gt; 无效,因为它至少需要一个模板参数,所以编译失败。

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

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) {}
};

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多