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++ 中的静态鸭子类型 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

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

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include

随机推荐

  • 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