首页 > 解决方案 > 在这种可变参数非类型模板参数的情况下,为什么我需要一个主模板?

问题描述

我试图让这段代码编译,它没有。

#include <array>
#include <type_traits>
template<typename T, int head_size, int... tail_sizes>
struct yarray<T, head_size, tail_sizes...> : public  std::conditional_t<sizeof...(tail_sizes) == 0, 
    std::array<T, head_size>,
    std::array<yarray<T, tail_sizes...>, head_size>>
{};
error: 'yarray' is not a class template
    4 | struct yarray<T, head_size, tail_sizes...> : public  std::conditional_t<sizeof...(tail_sizes) == 0,
      |        ^~~~~~

然后我的一位专家朋友告诉我定义主模板并且它有效

// primary template
template<typename T, int... tail_sizes>
struct yarray{};

我的问题是为什么需要这个?从我所见,“递归”永远不会碰到空的可变参数包案例,所以我的原始代码具有所需的所有“信息”。

仅仅是“语言规则要求”,还是有其他原因需要这样做?

标签: c++variadic-templatesc++20non-type-template-parameter

解决方案


事实证明,有一个 hack 可以使这样的 工作,我的朋友帮助我得到了这个 hack/解决方法。

constexpr int terminate = 123456789;

template<typename T, int head_size, int tail_head=terminate, int... tail_sizes>
struct yyarray:
    public  std::conditional_t<tail_head == terminate, 
    std::array<T, head_size>,
    std::array<yyarray<T, tail_head, tail_sizes...>, head_size>>
{};

正如评论所说,我最初的问题的答案是否定的,你不能有模板专业化,即使它“明显”它应该如何表现。


推荐阅读