c++ - 为什么是模板布尔 is_array模板的部分特化布尔 is_array?
问题描述
如何理解这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;
}
我还注意到,一般来说,部分模板特化中的模板参数数量少于主模板中的模板参数数量。
部分专业化通常如下所示:
#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>
,首先尝试特化,但它无法匹配。然后尝试主模板,并且匹配,因此选择了主模板。
正如您所提到的,专业化通常具有较少的模板参数。这不是必需的,只要我上面提到的规则适用,即特化必须匹配主要可以匹配的类型的严格子集。
事实上,专业化甚至可以拥有比主类更多的模板参数。同样,要求只是特化匹配主要匹配类型的子集。
推荐阅读
- python - Python pandas - 未实现在多索引上合并多于一级的重叠
- c# - 无法从 Azure 函数中的 Blob 存储读取文件
- python - 班级内的调度员
- selenium - 如何在 Chrome 70 网络驱动程序上强制启用闪存?不是铬 62
- aws-lambda - 使用 AWS lambda 函数调用 lex 聊天机器人
- reactjs - 不断收到“对象不是函数”错误
- go - 如何对嵌入在结构中的 http 处理程序进行单元测试?
- c# - 为什么在 VS Debugger 中启动一个进程在第一次运行时需要更长的时间?
- python - 寻找巨大稀疏矩阵的最大特征值
- git - .gitignore 不忽略 .rubocop.yml 文件