类中可能的模板专用化

Probable template specialization within a class

本文关键字:专用      更新时间:2023-10-16

我遇到了如下代码:

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声明没有定义?

(代码编译没有问题。

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

是的。这会将任何实例化YY<T>不完整的类型,但...

第二个 YY 声明是部分模板专用化吗?

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

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

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

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

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