gpt4 book ai didi

c++ - 为什么 template bool is_array 是 template bool is_array 的部分特化?

转载 作者:行者123 更新时间:2023-12-03 10:05:17 25 4
gpt4 key购买 nike

如何理解 template<typename Tp> bool is_array<Tp[]> = truetemplate<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[] 等。主要也会匹配这些类型,但主要会另外匹配 intcharstd::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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com