为什么 template<classTp> bool is_array<Tp[]> 是 template<class T> bool is_array<Tp> 的部分特化?

Joh*_*ohn 4 c++ templates template-specialization

如何理解这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;
}
Run Code Online (Sandbox Code Playgroud)

我还注意到,一般来说,部分模板特化中的模板参数数量少于主模板中的模板参数数量。

部分专业化通常是这样的

#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);
}
Run Code Online (Sandbox Code Playgroud)

cig*_*ien 7

对于一个模板是一个专业化一的,它需要更专业比主。这基本上意味着专业化必须匹配主要类型可以匹配的严格类型子集

在你的情况,专业化将匹配int[]char[]等主也将匹配这些类型,但主要会匹配另外类型,如intcharstd::vector<std::string>等。

当指定这样的模板参数时is_array<int[]>,规则说首先尝试特化。在这种情况下,Tp[]可以匹配int[](基本上通过取代intTp)等选择了专业化。

当指定这样的模板参数时is_array<int>,首先尝试特化,但它无法匹配。然后尝试主要模板,并且匹配,因此选择主要模板。

正如您所提到的,专业化的模板参数通常较少。这不是必需的,只要我上面提到的规则适用,即特化必须匹配主要可以匹配的类型的严格子集。

事实上,特化甚至可以有比主更多的模板参数。同样,要求只是特化匹配主要匹配的类型子集。