【发布时间】:2021-11-16 16:07:12
【问题描述】:
我试图编译这段代码,但没有。
#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,
| ^~~~~~
然后我的一个专家朋友告诉我定义主模板和它works。
// primary template
template<typename T, int... tail_sizes>
struct yarray{};
我的问题是为什么需要这样做? 从我所见,“递归”永远不会碰到空的可变参数包的情况,所以我的原始代码具有所需的所有“信息”。
仅仅是“语言规则要求”,还是有其他原因需要这样做?
【问题讨论】:
-
您需要一个主模板,句号。没有专业就没有专业。
-
你写了一个模板专业化,但具体是什么模板的专业化?它有默认模板参数吗?有参数包吗?也许不止一包?编译器应该怎么知道?在你说“哦,但在这种情况下它不需要知道”之前,写下所有不需要知道的情况。
-
我相信,即使
template<typename T, int... tail_sizes> struct yarray;也应该可以工作,并且可以防止意外使用非专业模板。 (我在编写特征时已经使用了它。我不需要参数包,但我想知道这是否会改变任何东西。) -
@n.1.8e9-where's-my-sharem 我希望它将被解释为“需要”至少提供 1 个整数的主模板(因为我有 int head_size, int... tail_sizes 所以对于 tail_sizes sizeof... 为 0 的情况,您仍然需要 head_size)。但你提出了一个有效的观点。为了节省 3 行代码,标准化可能太复杂了……
-
你在递归的最后一步做形成
yarray<T>——事实上它只用作类模板(std::conditional)的模板参数与它无关只是因为它不需要是完整的。
标签: c++ variadic-templates c++20 non-type-template-parameter