类中可能的模板专用化
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
是具有TT
和UU
的配对类型。
为什么第二个 YY 声明有两个模板参数(TT 和 UU),而第一个 YY 声明只有一个模板参数 (TT)?
代码的作者不想对货币对的类型施加任何条件,它们应该是任意的。通过编写这样的专用化,您基本上将所有YY
实例化提升为具有两个参数的模板std::pair
。
为什么第一个YY声明没有定义?
因为它可能不需要。创建专业化所需的只是一个声明。如果你真的在那里定义了YY
,你会得到一个"默认"实例化,当没有专用化时,它总是被实例化。如果您希望编译失败,如果您选择了没有专用化的类型,则可以这样做。或者(可能更好),您实际上会定义模板,其中包含一个static_assert(!std::is_same_v<T, T>)
或类似的东西,以及比"无法创建不完整类型的对象"更有意义的消息。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- 静态数据成员模板专用化的实例化点在哪里
- 特征 3 类的模板专用化
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 使用其他模板的模板专用化
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 嵌套模板显式专用化
- 如何检查模板专用化是否是基本模板的子类?
- C++:部分模板专用化用例
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 如何为静态常量模板化专用整数值分配存储
- 模板类的部分模板专用化,如 std::function
- 合并一组模板专用化