布尔 is_array?,c++,templates,template-specialization"/>

首页 > 解决方案 > 为什么是模板布尔 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);
}

标签: c++templatestemplate-specialization

解决方案


要使模板成为主要的特化需要比主要的更专业。这基本上意味着特化必须匹配主要可以匹配的类型的严格子集。

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

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

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

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

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


推荐阅读