gpt4 book ai didi

c++ - Loki MakeTypelist递归模板让我感到困惑

转载 作者:行者123 更新时间:2023-12-03 07:22:32 27 4
gpt4 key购买 nike

我正在研究loki源代码。下面是MakeTypelist,这让我感到困惑。

class NullType {};
template <class T, class U>

struct Typelist
{
typedef T Head;
typedef U Tail;
};
template
<
typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
>
struct MakeTypelist
{
private:
typedef typename MakeTypelist
<
T2 , T3 , T4 ,
T5 , T6 , T7 ,
T8 , T9 , T10,
T11, T12, T13,
T14, T15, T16,
T17, T18
>
::Result TailResult;

public:
typedef Typelist<T1, TailResult> Result;
};

template<>
struct MakeTypelist<>
{
typedef NullType Result;
};

using MyType=MakeTypeList<int, unsigned int, long, unsigned long, float>
递归模板如何终止?
它与空类型版本 MakeTypelist不匹配,
最终它将匹配 MakeTypelist<NullType, NullType, NullType, NullType .....>吗?

最佳答案

递归模板将由于定义了特殊化template<> struct MakeTypelist<>而终止,该函数返回NullTypeResult值。
这种特化完全等同于代码的下一个变体

template<>
struct MakeTypelist<NullType, NullType, NullType, NullType, ..... /* ... 18 Times ... */>
// .......
因为如果没有提供所有模板参数,或者没有提供所有模板参数,那么所有未提供的模板参数都被视为等于默认值,即等于 = NullType(请参阅主模板定义,它具有所有18个参数类型都具有默认 = NullType)。
对于那些未提供的模板参数,选择默认参数的逻辑与使用带有默认参数的函数(例如,如果您具有类似 void f(int a = 0, int b = 0)的功能,则可以用三种不同的方式来调用它: f()f(0)以及 f(0, 0),它们都将给出相同的结果。而那些未提供的函数参数将被视为等于默认值。模板特化方面也是如此-如果您不提供任何参数,即编写 struct MakeTuplelist<>,则所有18个参数类型都将被视为 NullType,因为所有18个参数都具有默认值 = NullType,与上面带有默认参数示例的函数中的行为相同。
同样在特化中,您可能只提供一些模板参数,其余的将被认为等于默认值,例如 template<> struct MakeTypelist<int, bool>特化将与特化 template<> struct MakeTypelist<int, bool, NullType, NullType, ...... /* 16 NullTypes */>完全相同。
递归终止,因为最后一条尾部等于 MakeTypelist<NullType, NullType, NullType, .....>,后者与 MakeTypelist的专用版本匹配,后者通过为 NullType提供 Result值来减少递归。
Try it online!
PS。相同的defaults-behavior不仅适用于模板的特化,还适用于用法,在两种情况下,您都可以使用 typedef MakeTypelist<> T;typedef MakeTypelist<int, bool> T;之类的模板,其余18种模板参数类型将等于默认值 = NullType

关于c++ - Loki MakeTypelist递归模板让我感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64674120/

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