我遇到了以下代码:
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声明没有定义?
(代码编译没有问题。)
答案 0 :(得分:1)
具体来说,第一个YY声明是前向声明吗?
是。这使得任何实例化YY<T>
都是不完整的类型,除了......
第二个YY声明是否是部分模板专业化?
...如果某个类型或类的类(如指针)有一个模板特化,它提供了一个完整的定义。在这种特殊情况下,这确实是一种部分专业化,适用于所有YY<T>
T
为TT
和UU
的对类型。
为什么第二个YY声明有两个模板参数(TT和UU),而第一个YY声明只有一个模板参数(TT)?
代码的作者不想对该对的类型施加任何条件,它们应该是任意的。通过编写这样的专业化,您基本上可以推广所有YY
实例化,将std::pair
作为具有两个参数的模板。
为什么第一个YY声明没有定义?
因为可能不需要它。创建专业化所需的只是一个声明。如果你在那里实际定义了YY
,你就会得到一个“默认”实例化,当没有专门化的时候,它会被实例化。如果您想要编译失败,如果您选择了没有专业化的类型,那么您可以这样做。或者(可能更好),你实际上会定义模板,包含static_assert(!std::is_same_v<T, T>)
或类似的东西,以及比“不能创建不完整类型的对象”更有意义的消息。