【问题标题】:Recursive calculation of variable template value变量模板值的递归计算
【发布时间】:2018-11-04 06:41:51
【问题描述】:

这就是我想要完成的工作(但失败了)。这个想法是count<N> 必须等于N。这是一个更复杂计算的简化案例,不要介意这段代码明显的愚蠢。

template <>
constexpr size_t count<0> = 0;

template <auto N>
constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;

int main()
{
    return count<1>;
}

无法编译:

<source>:5:23: error: expected initializer before '<' token

 constexpr size_t count<0> = 0;
                       ^

如果我用专业化交换一般情况,它也不会编译。它甚至可以使用可变模板吗?

Try it online

【问题讨论】:

    标签: c++ templates c++14 c++17


    【解决方案1】:

    这是正确版本的代码:

    template <auto N>
    constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;
    
    template <>
    constexpr size_t count<static_cast<size_t>(0)> = 0;
    

    注意以下几点:

    1. 必须在任何特化之前声明主模板。没有例外。
    2. 特化count&lt;0&gt; 和count&lt;static_cast&lt;size_t&gt;(0)&gt; 是不同的,因为它们的参数有不同的类型。在您提供显式特化 count&lt;0&gt; 的原始代码中,主模板定义中指定的 count&lt;1&gt; 中发生的递归不会使用此特化,这就是发生无限递归的原因。

    【讨论】:

    • 现在我明白了,非常感谢您的清晰和中肯的解释!
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多