C++ 为什么模板<;classTp>;布尔是_数组<;Tp[]>;模板的部分专门化<;T级>;布尔是_数组<;Tp>;?
如何理解C++ 为什么模板<;classTp>;布尔是_数组<;Tp[]>;模板的部分专门化<;T级>;布尔是_数组<;Tp>;?,c++,templates,template-specialization,C++,Templates,Template Specialization,如何理解模板bool is_array=true是模板bool is_array=true的部分专门化 这里是相关的 #包括 模板 bool是_数组=false; 模板 bool是_array=true; int main() { std::cout这里是编译器为您的代码生成的中间输出(参考) 编译器正在使用数组的专用模板 模板 bool是_数组=false; 模板 bool是_数组=false; 模板 bool是_array=true; 模板 bool是_array=true; int mai
模板bool is_array=true
是模板bool is_array=true
的部分专门化
这里是相关的
#包括
模板
bool是_数组=false;
模板
bool是_array=true;
int main()
{
std::cout这里是编译器为您的代码生成的中间输出(参考)
编译器正在使用数组的专用模板
模板
bool是_数组=false;
模板
bool是_数组=false;
模板
bool是_array=true;
模板
bool是_array=true;
int main()
{
std::cout.operator对于要成为主模板专门化的模板,它需要比主模板更专门化。这基本上意味着专门化必须匹配主模板可以匹配的严格类型子集
在您的例子中,专门化将匹配int[]
,char[]
,等等。主类也将匹配这些类型,但主类还将匹配诸如int
,char
,std::vector
等类型
当指定像这样的模板参数时,is_array
,规则说首先尝试专门化。在这种情况下,Tp[]
可以与int[]
匹配(基本上是用int
替换Tp
),因此选择专门化
当指定像这样的模板参数时,is_array
,会首先尝试专门化,但它无法匹配。因此,会尝试主模板,并且会匹配,因此会选择主模板
正如您所提到的,通常情况下,专门化具有较少的模板参数。这是不必要的,只要我上面提到的规则适用,即专门化必须匹配可由主模板匹配的严格类型子集
事实上,专门化甚至可以比主类拥有更多的模板参数。同样,要求专门化只匹配主类匹配的类型子集。专门化甚至可以比主类拥有更多的模板参数。下面是一个:
#包括
模板
bool是_数组=false;
模板
bool是_array=true;
int main()
{
std::cout映像T
是Tp[]
,比如T=int[]
。我不确定你到底在问什么。你不清楚部分模板专门化的规则吗?@cigien我有理由肯定John在问为什么数组版本被视为专门化,即不选择is_array=false;@CaptainGiraffe是的,很抱歉我的英语不好。我的问题是为什么数组版本被视为专门化专门化。一般来说,部分模板专门化中的模板参数数量少于主要的模板参数数量。我已经扩展了我的答案,以解决关于模板参数数量的部分。此规则在部分排序下进行了描述。“正式地说,为了在部分专门化之间建立比关系更专门化的关系,每个都首先转换为一个虚构的函数模板,如下所示:…”我认为在第一个代码片段(在您的答案中)中没有部分专门化。这确实是一个完全专门化。
#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;
}
#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);
}
#include<iostream>
template<typename T>
bool is_array = false;
template <typename Tp, int N>
bool is_array<Tp[N]> = true;
int main()
{
std::cout << is_array<int> << std::endl;
std::cout << is_array<int[5]> << std::endl;
}