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

标签 c++ templates template-specialization

如何理解 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/

相关文章:

c++ - 如何在另一个类中重载运算符 ==

c++ - 在多个文件之间拆分模板特化会导致 ODR 违规吗?

c++ - 基于基类的特殊成员函数

c++ - 如何选择部分模板特化?

C++ 输入和输出流

c++ - 将不同枚举类类型作为输入的函数,怎么样?

c# - 检索 Windows 8 产品 key

c++ - 需要帮助修复奇怪的模板错误

c++ - 如何释放包含 std::vector 的对象的内存

c++ - 通过直接函数调用将 std::promise 对象传递给函数