您必须考虑到模板参数分为三种类型:
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_specialization
struct 是一个模板结构,它接收类型 (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
.