为什么我需要一个主模板在这种情况下可变的非类型模板参数?



我试着编译这段代码,但是没有成功。

#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模板,它工作。

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

我的问题是为什么需要这个?从我看到的"递归"来看从来没有碰到空的可变包,所以我的原始代码有所有的"信息"。需要的。

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

原来有一个hack可以让这样的东西工作,我的一个朋友帮我得到了这个hack/workaround。

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

正如评论所说,我最初的问题的答案是简单的不,你不能有模板专门化,即使它是"明显的"。它应该如何表现。

相关内容

最新更新