模板通过 const 引用传递

2024-02-14

我已经看过一些类似的问题,但我仍然很困惑。我正在想办法明确地(不是通过编译器优化等)和 C++03 兼容,避免在将对象传递给对象时复制对象专门模板功能。这是我的测试代码:

#include <iostream>

using namespace std;

struct C
{
  C() { cout << "C()" << endl;  }
  C(const C&) { cout << "C(C)" << endl; }
  ~C() { cout << "~C()" << endl;  }
};

template<class T> void f(T) { cout << "f<T>" << endl; }

// This shows two possible ways, I don't need two overloads
// If I do it like (2) the function is not called, only if I do it like (1)

template<> void f(C c) { cout << "f<C>" << endl; } // (1)

template<> void f(const C& c) { cout << "f<C&>" << endl; } // (2)

int main()
{
    C c;
    f(c);
    return 0;
}

(1)接受类型的对象C,并制作一份副本。这是输出:

C()
C(C)
f<C>
~C()
~C()

所以我尝试专注于const C&参数(2)来避免这种情况,但这根本不起作用(显然原因在这个问题 https://stackoverflow.com/questions/4677592/specializing-function-template-for-reference-types).

好吧,我可以“通过指针传递”,但这有点丑陋。那么有没有一些技巧可以很好地做到这一点呢?

编辑:哦,可能我不清楚。我已经有一个模板化函数

template<class T> void f(T) {...}

但现在我想专门化这个函数来接受另一个对象的常量:

template<> void f(const SpecificObject&) {...}

但只有当我将其定义为

template<> void f(SpecificObject) {...}

基本上我想对这个专业做的是适应SpecificObject到模板界面就像

template<> void f(SpecificObject obj){ f(obj.Adapted()); } // call the templated version

EDIT2:好的,我可以强制const C&专业化可以这样称呼:

f<const C&>(c);

但有没有办法让它像这样工作f(c)?

EDIT3:如果有人最终会有类似的问题,我终于在另一个问题中找到了这个链接,它很有帮助:http://www.gotw.ca/publications/mill17.htm http://www.gotw.ca/publications/mill17.htm


您混淆了三个问题:模板、重载和参数传递。

只需删除专业化并将参数传递为T const&.

干杯,

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

模板通过 const 引用传递 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • ASP.NET MVC 自定义 ModelMetadataProvider 和 ModelValidatorProvider

    在我的 ASP NET MVC 应用程序中 我在数据库中定义了基于元数据的模型 我有一个定义数据元数据的自定义对象 并使用数据集进行 DTO 为了显示这一点 我计划编写一个自定义 ModelMetadataProvider 和 ModelV
  • 在 PyCUDA 中迭代二维数组

    我试图在 PyCUDA 中迭代一个 2D 数组 但最终得到了重复的数组值 我最初抛出一个小的随机整数数组 它按预期工作 但是当我向它抛出图像时 我一遍又一遍地看到相同的值 这是我的代码 img np random randint 20 si
  • 为什么这个查询使用where而不是索引?

    EXPLAIN EXTENDED SELECT board FROM board WHERE board category id 5 AND board board id 0 AND board display 1 ORDER BY boa
  • 应用 Angular2 ngModel 后格式化输入值

    我正在尝试创建一个指令 将输入值格式化为货币格式 我能够在焦点和模糊上做我必须做的事情 并且在 ngOnInit 钩子 和任何其他钩子 中 输入元素尚未应用任何值 如何 监视 输入的值 并在应用初始值时对其进行格式化 这是我的指令 impo
  • CloudFormation:模板 RDS Mysql 以创建数据库、表、用户或加载架构

    我正在尝试使用 CloudFormation 找出一些用例 第一种情况是拥有现有的 AWS RDS MySQL 服务器 如何通过 CloudFormation 模板创建数据库 表和用户帐户 在查看了 Cloudformation 文档之后
  • VB.NET 中的 GoTo 语句和替代语句

    我在另一个论坛上发布了一个代码片段寻求帮助 人们向我指出使用GoTo语句是非常糟糕的编程习惯 我想知道 为什么会不好呢 有什么替代方案GoTo在 VB NET 中是否可以使用通常被认为是更好的实践 考虑下面的这个片段 用户必须输入他们的出生
  • Pylab - “模块”对象没有属性“图”

    我正在尝试使用 Tkinter 创建视图 因此我也使用 pylab 我的问题是我收到一条错误消息 属性错误 模块 对象没有属性 图 错误来自这行代码 self fig FigureCanvasTkAgg pylab figure maste
  • 加载 hazelcast 的所有实现

    我正在尝试在多个节点上使用 hazelcast 服务器 我已经在地图存储实现中实现了全部加载 我想知道这是否应该只在服务器节点上启用还是在所有节点上启用 如果我在所有节点上部署相同的内容 这是否不会创建不需要的数据库读取操作 如果我需要仅在
  • 弹出到根视图控制器,表视图不会发生动画崩溃

    我在标签栏控制器中有 3 个视图控制器 单击任何选项卡都会在导航堆栈中加载其根视图控制器 例如选项卡 1 选项卡 2 和选项卡 3 导航堆栈中的第二个视图控制器 tab2VC2 有一个 tableView 单击 tab2 在 tab2 中显
  • Django 可以与 py2exe 一起使用吗?

    我们想为大众市场创建一个 Django Intranet 应用程序 我们只需要支持 Windows 用户 并且 Windows 管理员 或 技术用户 需要非常轻松地进行部署 请记住 大多数 Windows 管理员 用户对 Python 等缺
  • 如果“else”无论如何都会发生,是否应该声明? [复制]

    这个问题在这里已经有答案了 可能的重复 在不需要的情况下应该保留还是删除 else https stackoverflow com questions 3533779 should else be kept or dropped in ca
  • 是否有一种 Objective-C 特定方法来计算整数中的位数

    我想计算 Objective c 中 32 位整数中设置为 1 的位 有些语言将其作为单个调用 Java 有 Integer bitCount C 有时有 popcount SQL 有 BIT COUNT Objective C 有等效的吗
  • Servlet 对 AJAX 请求的响应为空

    我正在使用 javascript 向 servlet 发送 AJAX 请求 Servlet 确实正在回复 但响应标头为空 响应文本也为空 当我尝试使用相同的客户端代码将请求发送到 php 页面时 它工作正常 这是两个客户端 您可以尝试它们并
  • 如何解析隐藏的输入值

    我在这里或谷歌上找不到与解析隐藏输入值相关的任何内容 例如这里的这段代码 我正在尝试解析 40 个字符的密钥
  • Hadoop分区器

    我想问一下Hadoop分区器 它是在Mappers中实现的吗 如何衡量使用默认哈希分区器的性能 是否有更好的分区器来减少数据偏差 Thanks 分区器不在映射器内 以下是每个映射器中发生的过程 每个映射任务将其输出写入循环缓冲存储器 而不是
  • MYSQL - 从不同数据库中选择

    如何从两个不同的数据库中将同一查询中的数据选择到同一服务器中 这就是我正在做的事情 但我的查询不起作用 sqlquery SELECT FROM database 2 table 2 WHERE database 1 table 1 dat
  • 使用 MPNowPlayingInfoCenter 处理 CarPlay 中的播放事件

    我正在尝试构建一个带有 CarPlay 集成的示例音频应用程序 该应用程序是一个测试项目 没有 API 没有流媒体 没有复杂的 UI 只是一个简短的歌曲名称列表 具有选择歌曲并播放的功能 我的目标是在 正在播放 屏幕上按下播放按钮时处理回调
  • Java接口是抽象类吗? [复制]

    这个问题在这里已经有答案了 我正在做一些家庭作业 之前试卷上的一个问题要求命名给定 UML 图中的所有抽象类 我想相当简单 有1个抽象类和3个接口 一般来说 这些接口是否符合抽象类的资格 问题是 虽然从技术上讲 接口可以在 Java 等语言
  • 如何阻止 Linux 初始化 USB HID 设备

    我有一个 USB HID 设备 可以在两种不同的模式下工作 模式的选择基于发送给它的 USB 枚举 初始化数据包的顺序 我使用的是运行 Raspbian 的 Raspberry Pi 3 但是如果我为桌面 Ubuntu 发行版编译代码 我也
  • 模板通过 const 引用传递

    我已经看过一些类似的问题 但我仍然很困惑 我正在想办法明确地 不是通过编译器优化等 和 C 03 兼容 避免在将对象传递给对象时复制对象专门模板功能 这是我的测试代码 include