如何理解 template<typename Tp> bool is_array<Tp[]> = true
是 template<typename T> bool is_array<Tp> = true
的部分特化?
这是相关的 code snippet:
#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;
}
我还注意到,一般来说,部分模板特化中的模板参数数量少于主模板中的模板参数数量。部分特化通常被视为 this :
#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);
}
最佳答案
要使模板成为主要的特化,它需要比主要的更特化。这基本上意味着特化必须匹配主要类型可以匹配的严格类型子集。
在您的情况下,特化将匹配 int[]
、 char[]
等。主要也会匹配这些类型,但主要会另外匹配 int
、 char
、 std::vector<std::string>
等类型。
当指定这样的模板参数时 is_array<int[]>
,规则说首先尝试特化。在这种情况下, Tp[]
可以与 int[]
匹配(基本上通过用 int
替换 Tp
),因此选择了特化。
当指定这样的模板参数时 is_array<int>
,特化首先被尝试,但它无法匹配。然后尝试主要模板,并且匹配,因此选择主要模板。
正如您所提到的,特化的模板参数通常较少。这不是必需的,只要我上面提到的规则适用,即特化必须匹配主要可以匹配的类型的严格子集。
事实上,特化甚至可以有比主更多的模板参数。同样,要求只是特化匹配主要匹配的类型子集。
关于c++ - 为什么 template<classTp> bool is_array<Tp[]> 是 template<class T> bool is_array<Tp> 的部分特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65547908/