我最近问了一个有关在编译时确定迭代器是否指向复杂值并收到有效答案的问题。
问题在这里: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)类型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
)的类时选择此专业。