类中可能的模板特化

时间:2017-12-08 13:37:30

标签: c++

我遇到了以下代码:

class XX
{
public:
    template<typename TT> struct YY;

    template<typename TT, typename UU> struct YY<std::pair<TT, UU>>
    {
        std::size_t operator()(std::pair<TT, UU> const& val) const
        {
            // content omitted for brevity
        }
    };
};

基本上,我很困惑,需要帮助才能理解这段代码。

具体来说,第一个YY声明是前进声明吗?第二个YY声明是否是部分模板专业化?为什么第二个YY声明有两个模板参数(TT和UU),而第一个YY声明只有一个模板参数(TT)?为什么第一个YY声明没有定义?

(代码编译没有问题。)

1 个答案:

答案 0 :(得分:1)

  

具体来说,第一个YY声明是前向声明吗?

是。这使得任何实例化YY<T>都是不完整的类型,除了......

  

第二个YY声明是否是部分模板专业化?

...如果某个类型或类的类(如指针)有一个模板特化,它提供了一个完整的定义。在这种特殊情况下,这确实是一种部分专业化,适用于所有YY<T> TTTUU的对类型。

  

为什么第二个YY声明有两个模板参数(TT和UU),而第一个YY声明只有一个模板参数(TT)?

代码的作者不想对该对的类型施加任何条件,它们应该是任意的。通过编写这样的专业化,您基本上可以推广所有YY实例化,将std::pair作为具有两个参数的模板。

  

为什么第一个YY声明没有定义?

因为可能不需要它。创建专业化所需的只是一个声明。如果你在那里实际定义了YY,你就会得到一个“默认”实例化,当没有专门化的时候,它会被实例化。如果您想要编译失败,如果您选择了没有专业化的类型,那么您可以这样做。或者(可能更好),你实际上会定义模板,包含static_assert(!std::is_same_v<T, T>)或类似的东西,以及比“不能创建不完整类型的对象”更有意义的消息。