gpt4 book ai didi

c++ - 递归变量模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:29 25 4
gpt4 key购买 nike

我尝试像使用其他模板一样使用变量模板,例如:我们已经知道如何计算 Fibonacci numberpower of a number使用元编程 template objects wrapping a static value or a enum value .

所以,我做的第一件事就是尝试特化一个模板变量,它按预期工作:

template <std::size_t VALUE> std::size_t value       = VALUE;
template <> std::size_t value<666u> = 1u;

std::cout << value<0u> << '\n'; // "0" as expected
std::cout << value<1u> << '\n'; // "1" as expected
std::cout << value<2u> << '\n'; // "2" as expected
std::cout << value<666u> << '\n'; // "1" as expected!!

知道变量模板特化是可能的,我尝试做一个变量模板斐波那契数:

template <std::size_t ITERATION>
std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
template <> std::size_t fibonacci<1u> = 1u;
template <> std::size_t fibonacci<0u> = 0u;

int main()
{
std::cout << fibonacci<5> << '\n'; // "8" expected;
return 0;
}

我从 Wandbox 得到的错误是以下内容:

error: expected primary-expression before ';' token
template <std::size_t ITERATION> std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
^

我不知道自己做错了什么,也不理解这个错误。我猜这个错误可能与我已经在使用它时尚 undefined variable 模板这一事实有关,所以我想知道是否有可能使用变量模板实现我的目标。

有什么提示吗?

非常感谢。

最佳答案

我的猜测是编译器尚未正确实现变量模板。例如,clang 3.7.0 编译您的代码但(修复了一个小错误:fibonacci<0u> = 1u)输出 0而不是 8对于 fibonacci<5> .

但是,如果我们这样做

std::cout << fibonacci<0> << '\n'; // "1" expected;
std::cout << fibonacci<1> << '\n'; // "1" expected;
std::cout << fibonacci<2> << '\n'; // "2" expected;
std::cout << fibonacci<3> << '\n'; // "3" expected;
std::cout << fibonacci<4> << '\n'; // "5" expected;
std::cout << fibonacci<5> << '\n'; // "8" expected;

然后我们得到了预期的结果。奇怪!

更新 由于函数模板比​​变量模板更成熟,下面是一个解决方法:

template <std::size_t ITERATION>
constexpr std::size_t get_fibonacci()
{
return get_fibonacci<ITERATION - 1u>() + get_fibonacci<ITERATION - 2u>();
}

template <>
constexpr std::size_t get_fibonacci<0u>() {
return 1u;
}

template <>
constexpr std::size_t get_fibonacci<1u>() {
return 1u;
}

template <std::size_t ITERATION>
std::size_t fibonacci = get_fibonacci<ITERATION>();

关于c++ - 递归变量模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117963/

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