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

问题描述 投票:1回答:1

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

问题在这里: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>

有人可以分解此模板并描述如何解决吗?

c++ templates variadic-templates template-meta-programming
1个回答
0
投票

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

1)类型2)非类型(或值)3)template-template

第一种类型以typename(或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>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 {};

is_specialization结构是一个模板结构,它接收类型(T)和一个模板模板Template作为模板参数,它们接受类/结构,该类/结构接收各种各样的类型的模板参数。

现在您的专业是is_specialization

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

[当第一个模板参数(Template<Args...>)是基于第二个模板(Template)的类时选择此专业。

© www.soinside.com 2019 - 2024. All rights reserved.