Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么模板<;classTp>;布尔是_数组<;Tp[]>;模板的部分专门化<;T级>;布尔是_数组<;Tp>;?_C++_Templates_Template Specialization - Fatal编程技术网

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;
}