为什么不能重载类模板?

2024-01-27

Reading 这个问题 https://stackoverflow.com/q/11964089/20984让我想知道:是否存在禁止类模板重载的技术原因?

通过重载,我的意思是拥有多个具有相同名称但参数不同的模板,例如

template <typename T>
struct Foo {};

template <typename T1, typename T2>
struct Foo {};

template <unsigned int N>
struct Foo {};

编译器设法处理重载函数和函数模板,是否可以将相同的技术(例如名称修改)应用于类模板?

起初,我认为单独使用模板标识符时可能会导致一些歧义问题,但唯一可能发生的情况是将其作为模板模板参数传递时,因此可以使用参数的类型来选择适当的超载:

template <template <typename> class T>
void A {};

template <template <unsigned int> class T>
void B {};

A<Foo> a; // resolves to Foo<T>
B<Foo> b; // resolves to Foo<N>

您认为这样的功能有用吗?是否有一些“好的”(即技术)原因导致这在当前的 C++ 中不可能?


第 12.5 节来自模板完整指南 (Amazon https://rads.stackoverflow.com/amzn/click/com/0201734842) 包含此引用:

您可能很想知道为什么只有类模板可以部分特化。原因大多是历史原因。 可能可以为函数模板定义相同的机制(参见第 13 章)。

在某些方面 重载函数模板的效果是类似的,但也有一些细微的差别。这些差异是 主要与以下事实有关:主模板需要 遇到使用时查找。专业是 仅在事后考虑,以确定应实施哪种实施 用过的。

相比之下,所有重载的函数模板都必须带上 通过查找它们进入过载集,它们可能来自 不同的命名空间或类。这增加了以下可能性 无意中在某种程度上重载了模板名称。

相反,它 还可以想象允许某种形式的类模板重载。 这是一个例子:

// invalid overloading of class templates
template<typename T1, typename T2> class Pair; 
template<int N1, int N2> class Pair; 

然而,似乎没有迫切需要 这样的机制。

此外,C++的设计和演变 (Amazon https://rads.stackoverflow.com/amzn/click/com/0201543303) 在第 15.10.3 节中包含此引用

因此我得出的结论是,我们需要一个“专业化”的机制 模板。这可以通过接受一般重载来完成 或者通过一些更具体的机制。我选择了一个特定的机制 因为我认为我主要是在解决由以下原因引起的违规行为 C 中的不规则性以及因为总是重载的建议 引发抗议声浪。我试图保持谨慎并 保守的;我现在认为这是一个错误。专业化为 最初定义是一种受限且异常的重载形式 与该语言的其余部分不太相符。

大胆强调我的。我将此解释为函数重载解析比类专业化更难实现(并且由用户正确理解)。因此,可能没有真正的技术障碍(类似于函数模板部分专业化),而是历史事故。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不能重载类模板? 的相关文章

  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • Android - Google Map API v2 - 不幸的是,应用程序已停止。每次强制关闭

    大家好 我在这里找到了关于使用 Google Map API 时强制关闭 Android 中的应用程序的类似主题 我几乎尝试了所有方法 一步一步按照教程进行操作并检查了两次以上 每次出现问题并且我的应用程序都会立即崩溃 我什至无法运行 Go
  • Bootstrap-select插件:如何避免闪烁

    Bootstrap select 插件非常棒 http silviomoreto github io bootstrap select http silviomoreto github io bootstrap select 它提供了一种在
  • Ruby on Rails、Paperclip、Heroku、GitHub 和 AWS - 保护密钥

    我正在使用 Heroku 托管的 RoR 我想使用回形针将文件存储在 s3 上 我的源代码托管在 github 上 全世界都可读 对世界其他地方保密密钥的最佳做法是什么 Paperclip 建议将访问密钥存储在配置文件 或代码 中 例如我有
  • 使用单链表,如何在python中交换节点?

    目前 我一直在尝试根据我的主功能开关 myList index 重新排列链表 def createList plist linkedList None goes backwards adding each element to the be
  • 使用 XPath 提取标签之间的文本(包括标记)

    我有以下 XML 片段 span class st In Tim em Power em Politieman span 我想提取之间的部分 span 标签 为此 我使用 XPath span class st 然而 这将提取所有内容 包括
  • 设置 ContentPresenter 中自动生成的文本块的样式

    正如我所看到的 很多人都遇到了这个问题 但我不明白为什么我的案例不起作用 它开始让我发疯 背景 我有一个DataGrid将根据每个单元格的值着色 因此 我有一个动态样式来解析每个单元格使用的实际模板 背景现在可以相应地工作 新问题 当我有深
  • 在会话状态中存储购物车的数据

    尝试将我存储的内容添加到购物车中以进入会话 然后将其转移到另一个页面以获取 GridView 以显示我已添加到购物车会话中的所有项目 将其存储为对象会话 AddToCart 获取该行详细信息并存储在会话中 然后获取该会话对象并将其显示在另一
  • HTML5 CANVAS:如何从服务器保存和重新打开图像

    我用 html5 canvas 画一些东西 然后我想保存它 当再次加载页面时 我想将我保存的图像加载回画布 我成功地将数据保存到服务器中的文件中 但由于某种原因 这是一个奇怪的文件 无法通过ant软件打开 当然也不能通过我的画布打开 我将其
  • 使用 f#/fable/asp.net/react 添加 google 登录按钮

    我正在使用 SAFE 堆栈 https safe stack github io https safe stack github io 并通过示例 dojo 到目前为止非常棒 我想扩展该示例以包含一个通过 Google 登录 身份验证的按钮
  • JavaScript 基于原型的继承的好例子

    我使用 OOP 语言进行编程已经有 10 多年了 但我现在正在学习 JavaScript 这是我第一次遇到基于原型的继承 我倾向于通过研究好的代码来学得最快 正确使用原型继承的 JavaScript 应用程序 或库 的编写良好的示例是什么
  • 如何将 ASP.Net Webforms 网站与 ASP.Net MVC Web 应用程序集成?

    我如何在一个主网站 例如 www example com 下运行这两个网站 该网站是使用 Visual Studio ASP Net MVC Web 应用程序项目编写和部署的 并且 ASP Net Web 表单网站将从主站点的子目录 例如
  • Windows批处理命令创建备份文件夹和替换文件夹

    我需要使用日期时间戳备份现有文件夹 并将其替换 删除并重新创建 为文件夹内的新内容 有人有脚本可以做到这一点吗 我尝试了以下代码 其中 ApplicationDeploymentFolderPath servername foldernam
  • 如何拟合 3D 数据

    我有一个 3D 点列表 我想将其拟合到一个球体 R 2 x x0 2 y y0 2 z z0 2 所以我想 我应该表达 z 并用 4 个参数 x0 y0 z0 和 R 拟合 2D 数据 z sqrt R 2 x x0 2 y y0 2 z0
  • Exchange Web 服务错误 - 远程服务器返回错误 405 方法不允许

    我正在尝试通过交换网络服务发送邮件 我查了一下msdn并找到了一些帮助 每次我尝试运行此代码时 我都会收到上述错误 我尝试几乎到处阅读 ExchangeService service new ExchangeService Exchange
  • 我们可以在Windows中通过命令提示符运行mysql查询吗?

    我们可以从 Windows 命令提示符运行 MySQL 查询吗 如果是这样 我们该如何做到这一点并通过命令提示符处理查询结果 尝试使用mysql MySQL 命令行工具 http dev mysql com doc refman 5 5 e
  • Windows 8 - .NET TCP AcceptAsync 回调未触发(被 Console.ReadLine() 阻止)

    我遇到了 Windows 8 和 VS2012 特有的问题 我有一个 TCP 套接字服务器和客户端 正在本地网络上进行一些测试 使用 sysinternals TCPView 我可以看到数据包从 TCP 客户端发送并到达 TCP 服务器 我
  • 从变量中打印 unicode 字符(swift)

    我有一个问题找不到解决方案 我有一个字符串变量保存unicode 1f44d 我想将其转换为unicode字符 通常人们会做这样的事情 println u 1f44d 我的意思是 let charAsString 1f44d code in
  • 如何在 Spring Boot 中为 Camel 配置 Jackson ObjectMapper

    我正在尝试使用 Jackson 在 Camel 路由上将 POJO 与 JSON 进行序列化和反序列化 其中一些具有 Java 8 LocalDate 字段 我希望将它们序列化为 YYYY MM DD 字符串 而不是整数数组 我们的 Spr
  • 如何声明 C# 记录类型?

    I read 在博客上 https www codeproject com Articles 1131035 New Features of CsharpC 7 将提供记录类型 class studentInfo string Studen
  • 为什么不能重载类模板?

    Reading 这个问题 https stackoverflow com q 11964089 20984让我想知道 是否存在禁止类模板重载的技术原因 通过重载 我的意思是拥有多个具有相同名称但参数不同的模板 例如 template