派生重载运算符,但仅对相同类型进行操作

2024-02-05

假设我有一个基类和两个从它派生的类:

class Base
{
protected:
    double value;
public:
    virtual ~Base();

    Base(double value) : value(value) {}
    Base(const Base& B) { value=B.value; }

    Base operator+ (const Base& B) const { 
        return Base(value+B.value); 
    }

};

class final Derived1 : public Base {
public:
    Derived1(double value) : Base(value) {}
};

class final Derived2 : public Base {
public:
    Derived2(double value) : Base(value) {}
};

我想完成以下任务:

int main(int argc, char *argv[])
{
    Derived1 a = Derived1(4.0);
    Derived2 b = Derived2(3.0);

    a+a; // this should return a Derived1 object
    b+b; // this should return a Derived2 object

    a+b; // this should FAIL AT COMPILE TIME

    return 0;
}

换句话说,我想保证继承的operator+只对对象进行操作同类型的作为调用实例。

我该如何干净地做到这一点?我发现自己为每个类重新定义了运算符:

class final Derived1 : public Base {
    ...
    Derived1 operator+ (const Derived1& D1) const {
        return Derived1(value+D1.value);
    }
    ...
};

class final Derived2 : public Base {
    ...            
    Derived2 operator+ (const Derived2& D1) const {
        return Derived2(value+D1.value);
    }
    ...
};

但这只是一种痛苦。此外,对我来说,这似乎不是正确的代码重用。

这里使用的正确技术是什么?


如果你能确定Derived1 and Derived2是叶类(即没有其他类可以从它们派生),您可以使用奇怪的重复模板模式 http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern:

template <typename T>
class BaseWithAddition : public Base {
    T operator+(T const& rhs) const {
        return T(value + rhs.value);
    }
};

class final Derived1 : public BaseWithAddition<Derived1> {
    // blah blah
};

class final Derived2 : public BaseWithAddition<Derived2> {
    // blah blah
};

(final是一项 C++11 功能,可防止进一步推导。)

如果您允许派生自Derived1 and Derived2然后你就会遇到麻烦:

class Derived3 : public Derived1 {};
Derived3 d3;
Derived1 d1;
Derived1& d3_disguised = d3;
d1 + d3_disguised; // oooops, this is allowed

没有办法在编译时阻止这种情况。即使您想允许它,如果没有适当的语义,也不容易获得此操作的正确语义。多次调度 http://en.wikipedia.org/wiki/Multimethods.

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

派生重载运算符,但仅对相同类型进行操作 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

    我有一个公共 API 在多个项目中多次使用 public interface Process
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • 如何从 Firebase 中推送的数据中获取价值?

    在我的 firebase 中 我存储了问题及其答案 每个答案都有一个 id 它是从 push 获得的 但我无法显示已回答问题的所有用户的列表 请帮忙 这是代码 ListView listView ArrayList
  • 如何组合两个 LPCWSTR?

    我有两个变量LPCWSTRs 我想创建一个新变量 该变量将具有第一个和第二个变量的值 我尝试过这个 但没有成功 LPCWSTR d L sd LPCWSTR f L f LPCWSTR df d f 当我尝试这样做时 我收到此错误 1 In
  • myisam 表上的外键替代方案?

    我正在开发一个需要使用外键的网站 但是我已经搜索遍了 共享主机不支持innoDB 我正在使用 MyISAM 引擎 有没有使用外键的替代方法 我需要的 table image image id PK table ratings rating
  • 使用 KNN 分类器进行数字识别之前的预处理

    现在我正在尝试使用 OpenCV 创建数字识别系统 WEB上有很多文章和例子 甚至在堆栈溢出 https stackoverflow com questions 9413216 simple digit recognition ocr in
  • 无法安装 Subversive SVN Team Provider

    当我尝试从 Eclipse Marketplace 或其项目站点 安装 Subversive SVN Team Provider 时 出现以下错误 The following solutions are not available Subv
  • WordPress 按标签查询相关帖子

    我正在尝试查询与 WordPress 中当前查看的帖子具有相同标签的帖子列表 我认为如果我可以查询当前帖子的标签列表 将其传递到一个变量中 然后将该变量传递到 query posts 参数中 它就可以完成工作 它似乎适用于帖子中的标签之一
  • CSS 填充简写声明中的反斜杠

    Qq com 网站有一个规则集 其中有两个填充声明 这看起来有点奇怪 我的问题是 11px 0部分做什么 这与覆盖第一个填充声明有关吗 我理解斜线在以下情况下的使用 css 样式声明中的 正斜杠 https stackoverflow co
  • 在 pandas to_csv 方法中保留列顺序

    pandas 的 to csv 方法不保留列的顺序 它选择按字母顺序排列 CSV 中的列 这是一个错误 已被报告并应该在版本 0 11 0 中得到纠正 我有0 18 0 import pandas as pd df pd DataFrame
  • 屏幕更新效果

    我一直在测量代码执行时间 以衡量本地执行脚本和在服务器上执行脚本之间的差异 有一次我忘记禁用screen updating庆幸的是 在更详细地考虑之前 我对闪光灯不敏感 当我第一次开始使用时VBA我一直认为它只是被使用 这样就不会吓到最终用
  • bash:jstat:找不到命令

    我想使用 gc 实用程序来分析我的 Cassandra 数据库的垃圾收集 但是当我运行 jstat 命令时 输出显示 bash jstat command not found 我搜索并发现 jstat 位于 JAVA HOME bin 但我
  • 为什么我无法向 Hotmail 发送电子邮件?

    这是我的代码 boundary sha1 whatever headers MIME Version 1 0 r n headers From Domainname email protected cdn cgi l email prote
  • 如何在通过回调添加和删除节点时固定 Dash Cytoscape 中节点的位置?

    我想使用以下示例数据源制作一个带有交互式网络图的 Web 应用程序 data Source Node a a b b c Destination Node b c c d d Link likes likes likes likes dis
  • 谷歌地图API获取国家和城市

    我可以使用 ajax 自动完成功能来从 google 地图 api 获取国家 地区吗 当有人输入 United 在 google 地图 api 上搜索该国家 地区并显示类似的结果时 你能给我举个例子 或者链接到谷歌地图API的解决方案吗 看
  • Android - Retrofit2 - java.security.cert.CertPathValidatorException:未找到证书路径的信任锚

    我想从服务器获取数据 https data egov kz api v2 zheke zhane zandy tulgalardy k1 v6 pretty https data egov kz api v2 zheke zhane zan
  • 如何在谷歌可视化图表上加载JSON数据?

    我是谷歌可视化的新手 我正在开发一个完整的仪表板 例如谷歌完整仪表板示例 https code google com apis ajax playground type visualization full dashboard 按照示例 我
  • 回车换行 Windows 和 Linux java 应用程序

    我正在开发一个集成测试应用程序 这就是我在测试用例中所做的事情 我读取了一个测试输入文件 该文件存储在 cvs 中 将其写入文件系统中的文件 应用程序轮询该文件的目录 处理它并创建输出文件 然后我轮询输出文件的目录 如果两个文件内容相等 则
  • 非 WSDL 模式下的 SOAP 问题

    我正在制作一个简单的网络服务 用于我拥有的两个网站之间的通信 由于它只是一个基本应用程序 我一直在没有 WSDL 文件的情况下工作 所以在non WSDL mode正如 PHP 手册所称 这基本上就是客户端的样子 client new So
  • ASP Response.Flush() 刷新部分数据

    我正在开发一个带有 ASP 服务器端的 Web 应用程序 并使用 iframe 进行数据推送 ASP 处理程序每 隔一段时间就会将一些 javascript 刷新到 iframe context Response Write context
  • 字符串是如何排序的?

    有人可以解释一下以下函数的输出 public static void main String args String str1 new String 20 String str2 new String 100 List
  • 派生重载运算符,但仅对相同类型进行操作

    假设我有一个基类和两个从它派生的类 class Base protected double value public virtual Base Base double value value value Base const Base B