Joh*_*ohn 4 c++ templates template-specialization
如何理解这template<typename Tp> bool is_array<Tp[]> = true
是对 的部分专业化template<typename T> bool is_array<Tp> = true
?
这是相关的代码片段:
#include<iostream>
template<typename T>
bool is_array = false;
template<typename Tp>
bool is_array<Tp[]> = true;
int main()
{
std::cout << is_array<int> << std::endl;
std::cout << is_array<int[]> << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我还注意到,一般来说,部分模板特化中的模板参数数量少于主模板中的模板参数数量。
部分专业化通常是这样的:
#include<iostream>
template<typename T, typename U>
class add
{
public:
add(T x, U y)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<typename U>
class add<int, U>
{
public:
add(int x, U y)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main()
{
add<int, double>(1, 5.0);
add<char, int>('a', 9);
}
Run Code Online (Sandbox Code Playgroud)
对于一个模板是一个专业化一的主,它需要更专业比主。这基本上意味着专业化必须匹配主要类型可以匹配的严格类型子集。
在你的情况,专业化将匹配int[]
,char[]
等主也将匹配这些类型,但主要会匹配另外类型,如int
,char
,std::vector<std::string>
等。
当指定这样的模板参数时is_array<int[]>
,规则说首先尝试特化。在这种情况下,Tp[]
可以匹配int[]
(基本上通过取代int
为Tp
)等选择了专业化。
当指定这样的模板参数时is_array<int>
,首先尝试特化,但它无法匹配。然后尝试主要模板,并且匹配,因此选择主要模板。
正如您所提到的,专业化的模板参数通常较少。这不是必需的,只要我上面提到的规则适用,即特化必须匹配主要可以匹配的类型的严格子集。
事实上,特化甚至可以有比主更多的模板参数。同样,要求只是特化匹配主要匹配的类型子集。
归档时间: |
|
查看次数: |
86 次 |
最近记录: |