gpt4 book ai didi

c++ - constexpr 的模板参数

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:57 31 4
gpt4 key购买 nike

我正在尝试将更“通用”的 const 输入参数传递给斐波那契的 constexpr 实现。当我用一个 int 替换模板参数时,事情又变糟了。

#include<iostream>
template <typename T>
constexpr auto fib_ce(T n) {
return (n>1) ? fib_ce(n-1)+fib_ce(n-2) : 1;
}

int main() {
std::cout<<fib_ce(4)<<"\n";
}

这是我得到的错误:

g++ -std=c++14 -o constexpr_fib constexpr_fib.cpp 
constexpr_fib.cpp:4:19: fatal error: recursive template instantiation exceeded maximum depth of 256
return (n>1) ? fib_ce(n-1)+fib_ce(n-2) : 1;

^

我如何为一个 constexpr 提供一个模板参数,它可以为这个 constexpr 接受 long、int、unsigned long 等输入

最佳答案

[dcl.spec.auto] 中的规则是:

If the type of an entity with an undeduced placeholder type is needed to determine the type of an expression, the program is ill-formed.

这只是为了缩短可以无限递归推导的任意复杂性。不过不要害怕,有一些方法可以解决这个问题:

  1. 只需使用 T 而不是 auto:

    template <class T>
    constexpr T fib_ce(T n) {
    return (n>1) ? fib_ce(n-1)+fib_ce(n-2) : 1;
    }
  2. 我们也有规则:

    Once a non-discarded return statement has been seen in a function, however, the return type deduced from that statement can be used in the rest of the function, including in other return statements.

    因此我们可以使用 if 语句来代替条件运算符。我们只需要反转逻辑,使已知类型的 return 语句先行:

    template <typename T>
    constexpr auto fib_ce(T n) {
    if (n <= 1) {
    return static_cast<T>(1); // ok, deduced as T
    }
    else {
    return fib_ce(n-1)+fib_ce(n-2); // we already deduced T, so sticking with it
    }
    }

关于c++ - constexpr 的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466838/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com