创建几个相互不兼容的数字类型[重复]

2023-12-06

我想创建封装原始数字类型的轻量级类型:

struct A { long value; }
struct B { long value; }
struct C { long value; }
...

这样我就可以将常用的算术运算应用于每种类型,并获得预期的结果(与内置类型 long 相比,没有任何运行时开销):

A a1 {10};
A a2 {20};
A a3 = a1 + a2:
++a3;
std::cout << a3;  // prints "31"
...

但是,我不想在不同类型之间进行任何(自动)转换,并且我不想允许任何混合不同类型的算术运算。例如,下面的代码应该not编译:

A a1 {10};
A a2 {20};
B b3 = a1 + a2:  // error, cannot convert A to B
a2 += b3;        // error, A::operator+=(B) does not exist
...

现在,如果我只想要一种类型,那么所有这些都会很简单;只需为 A 类定义适当的操作即可。但是,如果我尝试对仅名称不同的 A、B、C 等类执行相同的操作,它很快就会变得乏味。

我知道我可以使用预处理器宏来生成具有不同名称的多个副本。但是,我想知道是否有一种更优雅的方法,不使用预处理器,并且不需要任何重复的代码。 (C++11 特定解决方案很好。)


一种方法是模板化类,它充当实际类型的该类的唯一实现和类型别名。这可能如下所示:

namespace detail {
    template<typename Alias>
    struct Implementation {
        //do everything once
    };
}

using A = detail::Implementation<struct DummyA>;
using B = detail::Implementation<struct DummyB>;
using C = detail::Implementation<struct DummyC>;

只要每个使用不同的类型作为模板参数,每个都将是具有相同实现的唯一类型,并且真正的类可以隐藏在用户不应该接触的东西中。

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

创建几个相互不兼容的数字类型[重复] 的相关文章

随机推荐

  • 我可以同时选择和更新吗?

    这是对我正在做的事情的过于简单的解释 我有一个带有状态列的表 应用程序的多个实例将提取第一行的内容 状态为NEW 将状态更新为WORKING然后继续处理内容 通过两次数据库调用即可轻松完成此操作 首先是SELECT那么UPDATE 但我想在
  • 有没有一种方法可以使用 Apache Beam FileIO 为每条记录写入一个文件?

    我正在学习 Apache Beam 并尝试实现类似于 distcp 的东西 我使用 FileIO read filepattern 来获取输入文件 但是在使用 FileIO write 写入时 文件有时会合并 在作业执行之前知道分区计数是不
  • 溢出:隐藏在 Google Chrome 中未按预期工作

    我遇到了 overflow hidden CSS 属性的问题 在 Firefox IE8 和 Safari 5 中 当我将此属性应用于内容顶部用于包含广告横幅 如 adsense 排行榜或 flash 的 div 时 当窗口大小调整为足够小
  • 检测 jQuery 中的输入变化?

    使用jquery时 change on an input仅当输入失去焦点时才会触发该事件 就我而言 一旦输入值发生更改 我需要立即调用服务 检查值是否有效 我怎样才能做到这一点 更新了澄清和示例 例子 http jsfiddle net p
  • Selenium IDE 浏览器插件 3.1.0

    我已经安装了新的 Selenium IDE 3 1 0 Firefox 插件 但我找不到任何工具来导出测试 以便从 Python 驱动程序运行它们 我缺少什么 搜索 SO 仅返回旧版 IDE 的建议 但不返回新 Web 浏览器插件的建议 N
  • java中的位运算符仅适用于整数和长整型?

    我在Eclipse中编写了以下代码 byte b 10 some other operations b b Eclipse 希望在按位补码行中将其强制转换为字节 它说 类型不匹配 无法从 int 转换为 byte 我还尝试了其他按位运算和其
  • SIGSEGV 由“kill”生成时是否特殊?

    我知道SIGSEGV当内核使用它来报告内存访问冲突时 不能忽略它 但是如果我安装一个信号处理程序SIGSEGV什么都不做 然后另一个进程使用kill向我发送该信号 其行为是否与我使用 正常 信号相同 例如SIGUSR1 反而 Grijesh
  • “.save”仅在数据库中插入空值

    我正在尝试为一家医院制作 RoR 申请 以便它有患者 医生 办公室等 我遇到的问题是 在患者 注册 时 我无法将新患者保存在数据库中 事实上 尽管我已经检查过属性没问题 只是一个名字和一个个人ID 但一旦执行该方法 数据库中只出现一个带有
  • SAS中有没有一种有效的方法来转置大表

    我有一个 SAS 数据集需要转置 它具有以下形式 id 日期类型 值 我需要把它转换成 id 日期 valueoftype1 valueoftype2 有什么有效的方法可以实现这一点吗 我的数据非常庞大 例如 data one input
  • JQuery设置的文本值回发后丢失

  • Bootstrap Modal 按钮不起作用,仅在 iOS 上

    我的网站上有这个 Bootstrap Modal 它适用于除 Apple iOS 之外的所有内容 有没有人遇到过这个 有任何想法从哪里开始来解决这个问题 我已经尝试使用模拟器进行故障排除 似乎工作正常 只是 Iphone 似乎无法工作 这是
  • 粘贴 (Python) Web 服务器 - 自动重新加载问题

    当我以守护进程模式启动 粘贴 Web 服务器时 它似乎会在源文件的时间戳更新时停止重新加载的能力 这是我启动守护进程的方法 cd project bin paster serve reload daemon development ini
  • COM Interop 和 Outlook - 让 Outlook 可见?

    我正在通过 VB NET 程序自动化 Outlook 根据用户的请求将项目传输到日历和联系人中 一切正常 这不是问题 问题是 当 Outlook 尚未打开时 像这样自动执行 Outlook 会创建一个隐藏实例 我也许可以理解这有什么用处 可
  • MySQL 中前 5 个值的总和

    我有一个 MySQL 表 用于存储赛车锦标赛的结果 因此每一行都包含每个车手在某场比赛中的位置以及其他数据 我想要获得某个车手的前 5 名排名的总和 例如 如果车手的最佳位置是 1 2 2 4 5 我希望 MySQL 返回 14 我想做的是
  • 如何将数据发布到多页谷歌表单?

    我正在尝试通过 POST 自动填写 Google 表单 然而 当我实际将数据发布到其中时 只有第一页的问题实际上被填写了 示例代码 private static void PostToFormTest WebClient client ne
  • 如何在 C# Windows 应用程序中通过计时器控件刷新 Gridview?

    我有一个组合框 在组合框中有多个选项 如 5 秒 10 秒 20 秒等 当我选择任何一个选项时 网格视图会在该特定时间后刷新 以下是在 datagridview 中加载文件的代码 public string Path get set pri
  • 维护滚动位置和回发时的选定控制

    返回另一个基于网络的问题 当控件向服务器发出回发时 页面会刷新 很好 页面也会滚动回顶部并失去所选的控件 如果回发后相关 则根据发生的更改 控件将变得可见或隐藏 即使页面可见性没有任何变化 焦点也会丢失并且当前滚动会重置 在文本字段中输入的
  • 如何立即在网格视图中显示图像的选择

    我有一个问题 我有一个自定义网格视图 其中两个图像 一个是背景图像 第二个是复选标记图像 当我单击网格视图复选标记的一项时 会显示哪个项目显示图像选择 但是当我们想要选择网格视图的第二项 它还会在同一图像上显示复选标记 如下面所附图像所示
  • 在docker容器中安装cygwin时出错:系统找不到指定的路径。 (0x3) error=hcssshim::ImportLayer - 失败 在 Win32 中失败

    我有一个简单的 Dockerfile FROM mcr microsoft com windows 1809 Install chocolatey RUN powershell exe Set ExecutionPolicy Bypass
  • 创建几个相互不兼容的数字类型[重复]

    这个问题在这里已经有答案了 我想创建封装原始数字类型的轻量级类型 struct A long value struct B long value struct C long value 这样我就可以将常用的算术运算应用于每种类型 并获得预期