gpt4 book ai didi

c++ - 如何在编译时使用 C++ 模板存储递归函数的中间结果?

转载 作者:行者123 更新时间:2023-11-30 01:46:18 24 4
gpt4 key购买 nike

我问了How do I capture the results of a recursive function at compile-time? ,但我认为我的做法是错误的。

我有这样一个程序:

#include <iostream>
#include <list>

std::list<unsigned int> recursive_case(std::list<unsigned int>& result, unsigned int& i) {
result.push_front(1 + (i % 10));
i /= 10;
return i != 0 ? recursive_case(result, i) : result;
}

std::list<unsigned int> initial_case(unsigned int i) {
std::list<unsigned int> result;
result.push_back(i % 10);
i /= 10;
return i != 0 ? recursive_case(result, i) : result;
}

int main() {
auto list = initial_case(123);
bool first = true;
for (auto i: list) {
if (first) {
first = false;
} else {
std::cout << ", ";
}
std::cout << i;
}
std::cout << std::endl;
}

输出为 2, 3, 3

我想执行上述计算并获得相同的输出,但在编译时(循环迭代和输出打印将在运行时进行,即一切从 for 循环开始)。模板似乎是一种可能性(这就是我将此问题标记为这样的原因),但我对任何能够在编译时完成工作的事物持开放态度。

最佳答案

您可以使用constexpr 在编译时计算列表。我将递归转换为迭代并使用了 indices trick根据需要经常调用 calculate

#include <iostream>
#include <array>
#include <iterator>
#include <utility>

constexpr std::size_t count_digits(std::size_t N, std::size_t Count = 0)
{
return (N > 0) ? count_digits(N/10, Count+1) : Count;
}

constexpr std::size_t ipow(std::size_t N, std::size_t Base)
{
return (N > 0) ? Base*ipow(N-1,Base) : 1;
}

constexpr std::size_t calculate(std::size_t n, std::size_t i)
{
std::size_t p = ipow(i,10);
std::size_t t = (n/p) % 10;
return i > 0 ? (t+1) : t;
}

template<std::size_t Num, std::size_t C, std::size_t... Is>
constexpr std::array<std::size_t, C> build_list(std::index_sequence<Is...>)
{
return {{ calculate(Num, C-Is-1)... }};
}

template <std::size_t Num, std::size_t C = count_digits(Num)>
constexpr auto build_list()
{
return build_list<Num, C>(std::make_index_sequence<C>{});
}


int main()
{
constexpr auto list = build_list<123>();

for(auto e : list)
{
std::cout << e << " ";
}

return 0;
}

输出:

2 3 3 

live example

关于c++ - 如何在编译时使用 C++ 模板存储递归函数的中间结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428586/

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