递归计算变量模板值

Vio*_*ffe 4 c++ templates c++14 c++17

这就是我在努力工作(并且失败).这个想法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>;
}
Run Code Online (Sandbox Code Playgroud)

它不编译:

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

 constexpr size_t count<0> = 0;
                       ^
Run Code Online (Sandbox Code Playgroud)

如果我将一般情况与特殊化交换,它也不会编译.它甚至可以用变量模板吗?

在线尝试

Bri*_*ian 9

这是代码的正确版本:

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;
Run Code Online (Sandbox Code Playgroud)

请注意以下事项:

  1. 必须在任何特化之前声明主模板.没有例外.
  2. 专业化count<0>count<static_cast<size_t>(0)>不同,因为他们的论点有不同的类型.在原始代码中,您提供显式特化count<0>,此特化不会count<1>在主模板定义中指定的递归中使用,这就是无限递归发生的原因.