C++ 中如何解析嵌套模板?

2024-02-06

我最近问了一个关于确定迭代器在编译时是否指向复数值的问题,并收到了有效的答案。

问题在这里:如何专门针对指向复数值的迭代器的算法? https://stackoverflow.com/questions/59954327/how-can-i-specialize-an-algorithm-for-iterators-that-point-to-complex-values

解决方案是一组模板,用于确定一个模板是否是另一个模板的特化:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

这确实有效,但我真的很难理解它是如何工作的。特别是嵌套的template在一个template让我感到困惑。我对使用可变参数模板还相当陌生,并且没有提供类型的可变参数模板似乎很奇怪,例如:<class...>而不是这样的东西<class... Args>.

有人可以分解这个模板并描述它是如何解决的吗?


您必须考虑到模板参数分为三种类型:

1) types

2)非类型(或值)

3) 模板-模板

第一种类型前面是typename (or class)

template <typename T>
void foo (T const & t);

在前面的例子中,T是一个类型并且t(经典函数参数)是类型的值T.

模板参数的第二种类型是值,前面是值的类型(或auto,从 C++17 开始,对于未指定类型)

template <int I>
void bar ()
 { std::cout << I << std::endl; }

在前面的示例中I模板参数是类型的值int.

第三种类型是解释起来最复杂的。

你知道吗(我想)std::vector<int> and std::vector<double>是不同的类型,但它们有共同点std::vector,一个模板类。

模板-模板参数是接受的参数std::vector,不带参数的模板类。

模板-模板参数前面有一个template关键字,如下例所示

template <template <int> class C>
void baz ();

模板-模板参数C在前面的示例中,类(或结构)需要单个int(值)模板参数。

所以如果你有课

template <int I>
class getInt
 { };

你可以通过getInt,作为模板参数,baz()

baz<getInt>();

现在您应该能够理解您的代码:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

the is_specializationstruct 是一个模板结构,它接收类型 (T) 和一个模板-模板Template接受接收可变数量的类型模板参数的类/结构。

现在你有一个专业is_specialization:

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

当第一个模板参数 (Template<Args...>) 是基于第二个 (Template).

一个例子:如果你实例化

is_specialization<std::vector<int>, std::map>

主版本(继承自std::false_type) 被选择是因为std::vector<int>不是基于std::map.

但是如果你实例化

is_specialization<std::vector<int>, std::vector>

专业化(继承自std::true_type) 被选择是因为std::vector<int>是基于std::vector.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中如何解析嵌套模板? 的相关文章

随机推荐