gpt4 book ai didi

c++ - 整数序列实现 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:31 24 4
gpt4 key购买 nike

我一直在阅读编译时间序列,但我很难理解下面的程序是如何工作的。谁能详细解释一下下面的程序?谢谢!

#include<iostream>
template<int...>
struct ints
{

};

template<int N, int...args>
struct rev_seq : rev_seq<N - 1, 2 * args..., 1> {};

template<int...args>
struct rev_seq<0, args...>
{
using type = ints<args...>;

};

template<int N>
using RS = typename rev_seq<N + 1>::type;

template<int... args>
void fU(ints<args...>&& s)
{
for (const auto& i : { args... }) std::cout << i << " ";
std::cout << std::endl;
}
int main()
{
fU(RS<5>());
}

最佳答案

RS<2>()实例化 rev_seq<2, 2>::type

rev_seq<2, 2>::type是 rev_seq 的主要模板(不是专用模板):

template<int C, int N, int... Is>
struct rev_seq : rev_seq<C - 1, N, N - C, Is...>{}

这是一个递归声明,因此它派生自如下版本的自身:

rev_seq<2, 2, (empty int... Is pack)>

源自

rev_seq<2-1, 2, 2 - 2>

这是rev_seq<1, 2, 0>

那个0最后是 int... Is 的一部分在基类上打包

这再次递归

rev_seq<1, 2, 0>

源自

rev_seq<1-1, 2, 2-1, 0>

这是rev_seq<0, 2, (1, 0)>

看看最后一个参数是如何附加到包中的?

rev_seq<0, 2, (1, 0)>rev_seq 匹配以下模板特化 :

template<int N, int... Is>
struct rev_seq<0, N, Is...>
{
using type = ints<N, Is...>;
};

注意这个 struct不源自任何东西

此时,type类中的类型变为

ints<2, 1, 0>

看看特化如何使我们追加 N到序列的前面?

最后,我们传递构造的ints一个函数:

template<int... Is>
void fU(ints<Is...>&& s)
{
for (auto i : { Is... }) std::cout << i << " ";
std::cout << std::endl;
}

循环遍历整数

for (auto i : { Is... })

在这里{ Is...}是一个包扩展,创建一个初始化列表供我们迭代。有趣的是,这是您可以创建和使用初始化列表的极少数地方之一,几乎所有其他情况都归类为匹配某个类的 std::initializer_list 构造函数重载(例如,std::vector)

关于c++ - 整数序列实现 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670321/

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