C++ 中的静态鸭子类型

2024-01-04

C++ 对于模板参数给出的类型有某种鸭子类型。我们不知道什么类型DUCK1 and DUCK2会的,但只要他们可以quack(),它将编译并运行:

template <class DUCK1, class DUCK2>
void let_them_quack(DUCK1* donald, DUCK2* daisy){
  donald->quack();
  daisy->quack();
}

但写起来有点不方便。当我完全不关心实际类型时DUCK1 and DUCK2而是想充分利用鸭子打字的想法,那么我想要一些与上面略有不同的东西:

  1. 我想省略编写重复且几乎毫无意义的模板参数列表(想象一下如果有 7 只鸭子会发生什么......)
  2. 我想更明确地说,类型从未被使用过,只有接口才是重要的。
  3. 我想要某种接口注释/检查。以某种方式明确类型背后期望的接口。 (然而,这与鸭子类型有点不同。)

C++ 是否提供任何功能来实现这 3 个想法中的一个或多个?

(我知道在大多数情况下,虚拟继承是实现此类模式的选择方法,但这里的问题具体是关于静态多态性的情况。)


关于问题 1 和 2:从 C++14 开始,您可以省略显式template <typename ...样板和使用auto,但仅限于 lambda:

auto let_them_quack = [] (auto & donald, auto & daisy){
    donald.quack();
    daisy.quack();
};

(是的,我更喜欢引用指针)。 GCC 允许在常用函数中作为扩展这样做。

对于问题3,你所说的叫做concepts。它们在 C++ 中存在了很长时间,但只是作为一个文档术语。现在概念 TS正在进行中,允许您编写类似的内容

template<typename T>
concept bool Quackable = requires(T a) {
    a.quack();
};

void let_them_quack (Quackable & donald, Quackable & daisy);

请注意,它还不是 C++,只是一个正在进行中的技术规范。不过,GCC 6.1 似乎已经支持它了。使用当前 C++ 实现概念和约束是可能的;你可以在其中找到一个boost http://www.boost.org/doc/libs/1_60_0/libs/concept_check/concept_check.htm.

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

C++ 中的静态鸭子类型 的相关文章

随机推荐

  • Spring @Autowire 关于属性与构造函数

    因此 由于我一直在使用 Spring 如果我要编写一个具有依赖项的服务 我将执行以下操作 Component public class SomeService Autowired private SomeOtherService someO
  • 如何获取网页的最后修改日期? [复制]

    这个问题在这里已经有答案了 我想知道如何使用 C 获取网页的最后修改日期 我尝试了下面的代码 但我只得到今天的日期 HttpWebRequest req HttpWebRequest WebRequest Create http www c
  • React 开发工具中组件的forwardRef 是什么意思以及如何使用它?

    当我在 React 开发工具中检查组件结构时 我可以看到有一个forwardRef标记 我很困惑 因为源代码中没有使用它的迹象 它是怎么存在的以及我该如何使用它 The forwardRef调用不在您自己的代码中 它们在您正在使用的包中 s
  • 输入毫无意义的签名

    Consider a gt a gt a gt Bool 这个签名有什么有意义的定义吗 也就是说 定义不是简单地忽略论证 x gt a gt Bool 看来这样的签名还有很多 可以立即排除 Carsten K nig 在评论中建议使用自由定
  • 如何在 grep 中使用 POSIXLY_CORRECT?

    有一个变量POSIXLY CORRECT https www gnu org software bash manual bashref html index POSIXLY 005fCORRECT in Bash POSIXLY CORRE
  • TFS 2017:在同一 TFS 服务器上克隆/复制集合

    我想在同一个 TFS 服务器上创建我们的生产集合的克隆 副本 以用作沙箱 开发环境 恢复集合的备份并重命名它很容易 但我知道当我尝试附加集合时会出现 GUID 冲突 可能还有其他冲突 有没有办法解决 或者我只需要购买一台带有单独 TFS 实
  • 对齐 OCR 文本

    我正在根据历史记录创建一个数据库 这些历史记录是我从书籍中拍摄的页面 100K 页 在对每个页面进行 OCR 之前 我编写了一些 python 代码来进行一些图像处理 由于这些书中的数据没有采用格式良好的表格 因此我需要将每个页面分为行和列
  • 在java中使用外部硬件组件?

    我谈论的是可以通过某些端口或其他方式从外部连接到计算机系统的组件 而不是属于计算机本身的一部分或外围设备的任何组件 实际上 正在从事一个大学项目 用于控制铁路道口的交通灯和围栏 我有 Java 知识 但我不知道如何让交通灯和吊杆栏杆在基于
  • Swagger-PHP 用于为 Swagger-UI 生成 JSON 文件

    我正在尝试使用 Swagger PHP 生成 JSON 文件 以便我可以将它与 Swagger UI 一起使用来自动记录文档 我尝试了链接 https github com zircote swagger php https github
  • 在 C 中生成正弦信号而不使用标准函数

    我想在 C 语言中生成正弦信号 而不使用标准函数 sin 来触发 LED 亮度的正弦形变化 我的基本想法是使用具有 40 个点和插值的查找表 这是我的第一个方法 const int sine table 40 0 5125 10125 14
  • Matlab 中大型非稀疏矩阵的高效运算

    我需要在 Matlab 中操作大的 3 维非稀疏矩阵 使用纯矢量化会带来较长的计算时间 所以 我尝试将操作分成10个块 然后解析结果 当我看到纯矢量化不能很好地缩放数据大小时 我感到很惊讶 如下图所示 我提供了这两种方法的示例 Parame
  • 如何处理react-intl中的“丢失消息”错误?

    我正在使用 React intl 版本 2 4 0 对于某些翻译 我在控制台中收到 丢失消息 错误 有什么办法可以在不升级到 v3 的情况下处理它们吗
  • 如何在 XML 代码中使用“&”字符?

    我想使用 字符 但 Visual Studio 抛出异常 怎么得写这个 替换任何 with amp 它将在 XML 中正确加载
  • 如何在ubuntu上下载并使用python? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我最近购买了一台76系统的笔记本电脑 这是我第一次接触ubuntu操作系统 终端说我目前有版本 2 7 5 我不确定加号是什么意思 我的第
  • 将exe文件放入构建输出目录

    使用 WinSCP NET assembly 从 C 程序获得 SFTP 支持 在 Visual Studio 中构建我的项目时 我想WinSCP exe and WinSCPnet dll被复制到bin输出目录 WinSCPnet dll
  • ReadDirectoryChangesW 和 GetOverlappedResult

    我正在打电话ReadDirectoryChangesW异步监视后台线程中的目录更改 这是目录 basePath 打开并启动 阅读 线程 m hDIR CreateFileW basePath FILE LIST DIRECTORY GENE
  • 如何在Python中从现有的超类类型对象实例化子类类型变量

    我遇到了一种情况 我扩展了一个具有多个属性的类 class SuperClass def init self tediously many attributes assign the attributes like self attr at
  • 在用户等待时处理大量数据的最佳实践(在 Rails 中)?

    我有一个小书签 使用时会将当前浏览器页面上的所有 URL 提交到 Rails 3 应用程序进行处理 我正在使用的幕后Typhoeus https github com pauldix typhoeus检查每个 URL 是否返回 2XX 状态
  • NoAutomaticTrigger 类型作业的连续 Azure WebJob 停止时的通知

    All 我正在将现有辅助角色代码迁移到 Azure Web 作业 我正在尝试使用 WebJob SDK 1 0 以便与 Azure 网站完全集成 我的困难是 JobHost 不能很好地处理超出其通常的基于属性的调用选项 队列 Blob 等
  • C++ 中的静态鸭子类型

    C 对于模板参数给出的类型有某种鸭子类型 我们不知道什么类型DUCK1 and DUCK2会的 但只要他们可以quack 它将编译并运行 template