【问题标题】:Why do I need a primary template in this case of variadic non type template arguments?在这种可变参数非类型模板参数的情况下,为什么我需要一个主模板?
【发布时间】: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&lt;typename T, int... tail_sizes&gt; struct yarray; 也应该可以工作,并且可以防止意外使用非专业模板。 (我在编写特征时已经使用了它。我不需要参数包,但我想知道这是否会改变任何东西。)
  • @n.1.8e9-where's-my-sharem 我希望它将被解释为“需要”至少提供 1 个整数的主模板(因为我有 int head_size, int... tail_sizes 所以对于 tail_sizes sizeof... 为 0 的情况,您仍然需要 head_size)。但你提出了一个有效的观点。为了节省 3 行代码,标准化可能太复杂了……
  • 你在递归的最后一步形成yarray&lt;T&gt;——事实上它只用作类模板(std::conditional)的模板参数与它无关只是因为它不需要是完整的

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


【解决方案1】:

事实证明,有一个 hack 可以制作这样的东西 work,我的朋友帮助我得到了这个 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>>
{};

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

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2020-11-29
    • 2018-07-11
    • 1970-01-01
    • 2018-02-28
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多