gpt4 book ai didi

c++ - 了解 C++ 模板元编程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:37 26 4
gpt4 key购买 nike

为了更好地理解 C++ 中的模板和元编程,我正在阅读 this article ,但我对代码片段的理解很快就减少了,例如:

template<class A, template<class...> class B> struct mp_rename_impl;

template<template<class...> class A, class... T, template<class...> class B>
struct mp_rename_impl<A<T...>, B>
{
using type = B<T...>;
};

template<class A, template<class...> class B>
using mp_rename = typename mp_rename_impl<A, B>::type;

代码使用如下:

mp_rename<std::pair<int, float>, std::tuple>        // -> std::tuple<int, float>
mp_rename<mp_list<int, float>, std::pair> // -> std::pair<int, float>
mp_rename<std::shared_ptr<int>, std::unique_ptr> // -> std::unique_ptr<int>

有人可以像我五岁一样解释代码吗?我对非模板化 C++ 有一般和基本的了解。

我没有得到的是:

为什么是mp_rename_impl用两个类型参数 (class A, template<class...> class B) 声明前向,然后同时用三个 (template<class...> class A, class... T, template<class...> class B) 和两个 (A<T...>, B) 类型参数定义和专门化它?

我知道它别名 ( using type = B<T...>; ) type成为B<T...>而不是 A<T...> ,但我真的不明白它是如何完成的。

还有为什么是A仅在特化中使用模板模板参数?

[*] 肯定是我这里有问题

最佳答案

Why is mp_rename_impl forward declared with two type parameters (class A, template<class...> class B), then it's defined and specialized at the same time[*] with three (template<class...> class A, class... T, template<class...> class B) and respectively two(A<T...>, B) type parameters?

前向声明建立实例化所需的参数数量mp_rename_impl ,并且前者应该是实际类型,后者是模板。

然后当有实际实例化时,它会尝试匹配特化 struct mp_rename_impl<A<T...>, B> ,在这样做的过程中,它可以考虑特化的 A 值的任意组合。 , T...B符合专业的期望:即template<class...> class A, class... T, template<class...> class B .请注意 A特化中的参数与 A 共享一个名称在声明中,但不一样——前者是模板,后者是类型。实际上,为了匹配特化,模板实例化必须作为声明的 A 传递。参数,并且该模板的参数在 T... 处捕获.它对可以作为 B 传递的内容没有施加新的限制。 (虽然 using 语句确实 - B<T...> 需要有效,否则你会得到一个编译错误 - SFINAE 来不及启动)。

Also why is A a template template parameter only in the specialization?

特化调用该参数 A , 但它在概念上与 A 不同在声明中。相反,前者的 A<T...>对应后者A .也许特化应该将其称为“TA”或其他名称,以表明它是实际 A 的模板。可以与T...组合形成参数。然后特化是A<T...>, B ,因此编译器从实际尝试找到 A 的有效替换的任何实例化开始反向工作, T...B , 以 template<template<class...> class A, class... T, template<class...> class B> 中指定的形式限制为指导.

这是为了确保只有当两个参数是一个已经给定了一些参数类型集的模板和一个能够采用参数类型列表的模板时才匹配特化。匹配过程有效地隔离了 T键入列表,以便它可以与 B 重用.

关于c++ - 了解 C++ 模板元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449784/

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