C++ - 基于赋值侧重载 [] 运算符

2023-11-25

我正在尝试用 C++ 编写动态数组模板

我目前正在重载 [] 运算符,并且我想根据它们在赋值的哪一侧使用来实现不同的行为。

#include <iostream>
...

template <class T>
T dynamic_array<T>::operator[](int idx) {
    return this->array[idx];
}

template <class T>
T& dynamic_array<T>::operator[](int idx) {
    return this->array[idx];
}

using namespace std;
int main() {
    dynamic_array<int>* temp = new dynamic_array<int>();

    // Uses the T& type since we are explicitly 
    // trying to modify the stored object
    (*temp)[0] = 1;

    // Uses the T type since nothing in the array 
    // should be modified outside the array
    int& b = (*temp)[0]; 

    // For instance...
    b = 4;
    cout<<(*temp)[0]; // Should still be 1
    return 0;
}

由于显而易见的原因,当尝试像这样重载时,我会遇到编译器错误。

有没有正确的方法来做到这一点?

到目前为止我的搜索还没有成功。我所看到的任何重载的 [] 运算符似乎都接受用户可以修改对象外部的存储项。

我已经实现了使用 (instance(int i), update(int i, T obj)) 的方法,但如果能够像常规数组一样使用此类,那就太好了。


您不能仅重载返回类型。

提供恒定和非常量访问器重载的标准方法是通过常量来区分this:

T       & get()       { return x; }
const T & get() const { return x; }  // or T get() const;

对于常量版本,您可以返回常量引用或按值返回,具体取决于什么Tis - const-reference 可能更普遍有用。

(代替get()你会写operator[](std::size_t i), 当然。我只是想保持简短。)


我认为这并不能 100% 达到你的想法,但那是因为你的推理有错误:int b = foo() will never可以引用任何事物,即使foo()返回一个(常量或非常量)引用,因为b被声明为类型int, not int&。实际上,当你说时,你实际上会调用非常量版本int b = (*temp)[0];但这实际上不是问题。 (要获得恒定版本,你必须说int b = static_cast<const dynamic_array<int> &>(*temp)[0]; or (*static_cast<const dynamic_array<int> *>(temp))[0]- 但何苦呢。)

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

C++ - 基于赋值侧重载 [] 运算符 的相关文章

  • 将 Google 云端硬盘访问权限委派给服务帐户失败

    我参与构建了一个内部使用的应用程序 用户可以通过该应用程序上传文件 并将其存储在 Google Drive 中 由于建议不要使用服务帐户作为文件所有者 因此我希望代表公司系统管理员有权访问的指定用户帐户上传应用程序 我已经创建了该应用程序以
  • 共享库 C++ Makefile

    我需要编译胖二进制文件才能在另一台 Linux 机器上使用它 但缺少一些库 因此据我了解 我应该使用一些 shared 选项来编译它 但我不明白如何为此配置 Makefile 目前我的 makefile 如下所示 CC g CC FLAGS
  • 错误:调用 Configuration.BuildSessionFactory() 时“无法同时获取多个包”;

    升级到 NHibernate 2 1 后 我们收到此错误 QueryException Cannot simultaneously fetch multiple bags NHibernate Loader BasicLoader Post
  • 如何向 Iron Python 添加模块?

    我一直在尝试使用 C Visual Studio 执行以下 Python 代码 graphcreater py 我通过 NuGet 包管理器添加了 IronPyton 2 7 7 和 IronPython StdLib 2 7 7 一旦我运
  • 为什么要在 C 和 C++ 项目中创建 include/ 目录?

    当我处理我的个人 C 和 C 项目时 我通常把file h and file cpp在同一目录中 然后file cpp可以参考file h with a include file h 指示 然而 通常会发现库和其他类型的项目 如 linux
  • StreamReader 的默认值是多少?

    我需要使用这个构造函数public StreamReader Stream stream Encoding encoding bool detectEncodingFromByteOrderMarks int bufferSize bool
  • 如何重命名 MacOS/X 程序中的程序名称菜单标签?

    我有一个在 MacOS X 下运行的基于 Qt 的 GUI 程序 我希望能够更改该程序的第一个菜单标题的标签 即此屏幕截图中用红色圈出的标签 有没有一种编程方法可以做到这一点 假设不存在基于 Qt 的解决方案 则 Objective C 本
  • WCF:通用接口的序列化可能吗?

    我正在尝试实现一个服务契约 其中包含一个采用通用接口的方法 并且该通用接口本身被赋予一个接口参数 我用 ServiceKnownType 装饰了服务接口 用常规 KnownType 装饰了服务实现 并用常规 KnownType 装饰了数据契
  • 开始学习 C# 的最佳方式是什么?

    我对 vb 6 有一点编程经验 而 vb net 则不多 请告诉我成为专家 C 程序员的最佳方法 我知道这需要很长时间 想想你如何学习人类语言 阅读 写作 口语和听力 阅读代码 阅读文章 阅读示例 当您更有经验时 请查看您使用的一些项目的源
  • Linux 相当于 GetCommandLine 和 CommandLineToArgv?

    我想知道是否有一些 API 可以在 Linux 上获取当前进程的命令行参数 我想我是非常不清楚的 该问题的真正目的是通过命令行参数传递 unicode 文件名 从文件中读取 proc self cmdline 例如 wallyk zf od
  • 来自“void *”的dynamic_cast

    根据this https stackoverflow com questions 3155277 cannot dynamic cast void to templated class void 没有 RTTI 信息 因此从void 不合法
  • 对双向链表进行排序 C++

    尝试通过遍历列表的循环来完成此操作 在循环中 我将头节点输入到我定义的排序函数中 然后使用 strcmp 来确定节点中的哪个名称是否应该排在前面 它不起作用 因为写得太早了 我通过一次沿着列表一个节点进行线性比较 而不是回去查看第一个节点是
  • 网页上的富文本编辑器

    我正在尝试在我的网页中添加一个富文本编辑器 用户可以在其中撰写评论并格式化他们所写的内容 类似于我们在此网站上撰写帖子的编辑器 谁能指出我关于此的正确方向 任何可以帮助我构建这样一个组件的教程 我还想要一个免费的产品 忘记之前提到 类似的东
  • 查询 XmlDocument 而不会出现“命名空间前缀未定义”问题

    我有一个 Xml 文档 它定义并引用了一些命名空间 我将其加载到 XmlDocument 对象中 据我所知 我创建了一个 XmlNamespaceManager 对象 用于查询 Xpath 问题是我收到命名空间 my 未定义的 XPath
  • 运行 SQL Server 报告服务时如何解决“远程服务器返回错误:(401) 未经授权”?

    我正在用这个code http www codeproject com Articles 25994 Creating a Proxy to Download PDF Reports from SRS从 SSRS 创建和下载 PDF 报告
  • 使用 C# winforms 与 Windows 中的其他桌面应用程序交互

    我想知道是否可以与使用我的程序的其他程序进行交互 例如 单击另一个程序上的按钮等 我不确定这是否可能 但如果可能的话 有人可以提供一些 C 示例代码 Thanks 您可以创建消息并将其发送到其他进程 为此 您必须在 C 代码中使用 P In
  • 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?

    我有一个大型 复杂的 C GUI 应用程序 它以完全可重现的方式崩溃 但我无法轻松诊断崩溃的原因 因为调试会话不是以通常的方式使用调用堆栈破坏调试器 而是完全退出 唯一的提示是输出窗口末尾有一条消息 STATUS STACK BUFFER
  • 如何在控制台应用程序中创建事件循环/消息管道?

    我想创建一个注册了一些事件的控制台应用程序 问题是这些事件永远不会被触发 在这种特殊情况下Windows 窗体 http en wikipedia org wiki Windows Forms我应该调用的应用程序Application Ru
  • 在 Outlook 中检索当前电子邮件正文

    在我的 Outlook 插件中 我想在功能区上添加一个按钮 因此当用户单击此按钮时 我想检索当前选定的电子邮件的正文 我有此代码 但它只检索收件箱中的第一封电子邮件 因为索引为 1 Microsoft Office Interop Outl
  • 在 Angular 6 和 ASP.net 中启用 CORS

    我正在尝试从 Angular 6 应用程序向发送电子邮件的 API 发送 POST 请求 我用邮递员测试了该请求并且它有效 但是当我在 Angular 应用程序中执行 POST 请求时 我的控制台中出现错误 我在 Angular 应用程序中

随机推荐

  • 如何使用 Django 中内置的“password_reset”视图?

    我在 urls py 中设置了以下条目 r password reset django contrib auth views password reset 但一旦我去http 127 0 0 1 8000 password reset 我收
  • 在 colgroup 中使用文本对齐中心

    我的页面中有一个表格 我使用 colgroups 以相同的方式格式化此列中的所有单元格 它适用于背景颜色等 但我似乎无法弄清楚为什么文本对齐中心不起作用 它不会将文本居中对齐 Example table cellspacing 5 tabl
  • 如何在flutter中显示.9.png格式的图片?

    这是我的代码 new Image asset images launcher border highlight 9 png fit BoxFit fill 当我改变图像的宽度和高度时 它的显示效果很差 但在原生android中显示正常 fl
  • 在原子变量的上下文中什么是总线锁定?

    我使用 C 很长时间了 现在我开始学习汇编并了解处理器的工作原理 不仅仅是为了好玩 而且我必须将其作为测试程序的一部分 在学习汇编时 我开始听到一些在讨论多线程时到处听到的术语 因为我在科学计算中进行了大量的多线程处理 我正在努力了解全貌
  • 用 Java 处理下载

    我如何能够使用 Java 中的 HttpResponse 处理下载 我向特定站点发出了 HttpGet 请求 该站点返回要下载的文件 我该如何处理这个下载 InputStream 似乎无法处理它 或者也许我使用它的方式错误 假设你实际上正在
  • Fortran 可变参数宏中的 CPP/GPP(加上 Fortran // 连接)

    我正在尝试编译一个巨大的 世界知名的数值天气预报代码 主要用 Fortran 90 编写 使用cpp广泛且成功地与 PGI Intel 和 gfortran 合作 现在 我继承了一个版本 其中专家添加了数百个可变参数宏案例 他们使用英特尔和
  • 安装 IE9 后 Visual Studio 2012 崩溃(故障模块 ntdll.dll)

    Okay 自从 Visual Studio RTM 在我的工作计算机上发布以来 我一直在运行它 上周五我安装 更新了 IE 至版本 9 以测试 JavaScript 问题 安装 IE9 并重新启动计算机后 Visual Studio 201
  • .NET:Type.GetHashCode 是否保证唯一?

    我有人使用 Type GetHashCode 就好像它是主键一样 我认为这是一个可怕的想法 但我想知道是否有某种记录的特殊情况表明没有两种类型具有相同的哈希码 GetHashCode 没有任何保证 除了它可能会随机分布 不是唯一的 文档特别
  • VSTS 构建失败并出现 MSB3325,无法导入 PFX 密钥文件

    我创建了一个构建定义来在 Visualstudio com 上在线构建桌面应用程序 该应用程序在任务构建解决方案 Visual Studio 构建 中失败 并出现以下错误 错误 C Program Files x86 Microsoft V
  • 如何在 Play Framework 2 中调用接受可变数量参数的模板

    Play Framework 2 模板语言非常好 然而 尽管它 受到 微软 Razor 语言的 启发 但一个重要的设计决策是不同的 如何 逃回 HTML Razor 会寻找 HTML 样式的标签 而 Play 2 使用某种启发式方法 我正在
  • 计算第 N 个置换步骤?

    我有一个字母 a z 的 char 26 通过嵌套的 for 语句 我正在生成一个序列列表 例如 aaa aaz aba abb abz zzy zzz 目前 该软件被编写为从 aaa zzz 生成所有可能值的列表 然后维护一个索引 并遍历
  • MATLAB:需要制作 4D 绘图(3D + 颜色/颜色)

    我需要制作一个 3D 表面 其中颜色代表第四个变量 我知道 冲浪 与我需要的类似 但事实并非如此 基本上 我有以下变量 t 1 米 y 1 n a 1 o 这些应该是三个笛卡尔坐标轴 我还有一个变量 S 其尺寸为 m x n x o 基本上
  • 避免脚本中某些参数的混合

    我有一个脚本可以使用获取数十个参数 标志Getopt Long 某些标志不允许混合 例如 linux unix不允许一起供应 我知道我可以使用if陈述 有没有更干净 更好的方法来做到这一点 if如果我不想允许多种标志组合 块可能会变得丑陋
  • C/C++中有复制数组的函数吗?

    我知道Java有一个函数System arraycopy 复制数组 我想知道 C 或 C 中是否有一个函数可以复制数组 我只能找到通过使用复制数组的实现for循环 指针等 但是有没有可以用来复制数组的库函数 既然您要求 C 解决方案 inc
  • 如何使用 JavaScript 将字符串的波斯语和阿拉伯语数字转换为英语?

    如何使用简单的函数将波斯 阿拉伯数字转换为英文数字 arabicNumbers persianNumbers 它是相同的架构 但代码页不同 Oneliner英语 阿拉伯语和波斯语数字之间所有 6 种可能的翻译 警告 请注意 此解决方案效率不
  • Eclipse 为带有“m”后缀的域对象和类成员生成 getter/setter

    我有一个关于域对象中生成的 getter 和 setter 方法的小问题 我想为我的源代码使用通用的样式指南 该风格指南的一部分说 我以成员前缀 m 开头每个类成员名称 class User String mName List
  • 集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生突变

    有很多类似标题的问题 但没有一个对我有帮助 但我可以联系这个解决方案 NSGenericException 原因 集合 在枚举时发生了变化用我的问题来提问 因为这个终止正在发生 当我添加 删除带有数组的字符串对象时 Error 由于未捕获的
  • 在Python 3.2中绘制n条边的多边形

    我必须用 Python 编写一个程序来读取值 n 并在屏幕上绘制一个 n 边的多边形 我可以使用海龟图形模块或graphics py 模块 我知道当 n 输入的点数然后在屏幕上单击 n 次时如何绘制多边形 但我在了解如何将多条边转换为多边形
  • 将每隔一行移动到一个新列并将 pandas python 分组

    我有一个示例数据集 它比我的实际数据集小得多 它实际上是一个文本文件 我想将其作为 pandas 表读取并用它做一些事情 import pandas as pd d one title1 R2G title2 K5G title2 R14G
  • C++ - 基于赋值侧重载 [] 运算符

    我正在尝试用 C 编写动态数组模板 我目前正在重载 运算符 并且我想根据它们在赋值的哪一侧使用来实现不同的行为 include