C++ 概念复合了需求和返回类型需求

2024-01-11

上次我将 C++ 概念与 GCC 和 fconcepts 标志一起使用时,以下代码片段曾经起作用

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> bool;
  { a != b } -> bool;
};

显然情况已不再是这样了返回类型要求之后复合要求现在只能包含类型约束。如果我没记错的话,这基本上意味着使用另一个概念来满足返回类型要求.

因此,完全可读且(对于 C++ 标准)简短的片段就变成了

template <typename From, typename To>
concept convertible_to = std::is_convertible_v<From, To>;

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> convertible_to<bool>;
  { a != b } -> convertible_to<bool>;
};

当然,这还不是一个完整的实现,但我们现在忽略它。有人可以向我解释一下为什么委员会决定改变这一点吗?就我个人而言,我发现 Convertible_to 概念中的“隐式使用模板参数”非常令人恼火和混乱。


好吧,这实际上意味着什么:

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> bool;
  { a != b } -> bool;
};

是不是意味着a == b必须有类型exactly bool,或者这是否意味着如果你衰减你得到的类型bool (i.e. const bool or bool&都可以),或者这是否意味着可以转换为bool (i.e. std::true_type可以吗)?我认为从语法上看,这根本不是很清楚 - 并且这三个中的任何一个都可以由特定概念有意义地期望(如P1452 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1452r2.html指出,当时的比例Same<T> to ConvertibleTo<T>概念为 40-14)。

论文还指出,在 Concepts TS 中,-> Type存在,我们也有能力写类似的东西vector<Concept>... or -> vector<Concept>作为要求。这是一种类型,但很难与decltype(())我们采用的语义P1084 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1084r2.pdf.

基本上,我不认为“完全可读”的片段实际上是 - 该语法有多种潜在含义,所有这些都可以是所需的含义,具体取决于上下文。以及当时最常用的一种(same_as<bool>)甚至不是我们想要的(convertible_to<bool>).


就我个人而言,我发现 Convertible_to 概念中的“隐式使用模板参数”非常令人恼火和混乱。

它在 C++ 中很新颖,但我个人发现它在这些情况下读起来非常好。看到:

{ a == b } -> convertible_to<bool>;

完全按照要求阅读:a == b需要是一个可转换为的有效表达式bool。对于一元概念,它的用法非常好,因为您可以使用它们来代替有些无意义的概念typename/class关键词:

template <range R>
void algo(R&& r);

这与其他语言没有什么不同。例如,在 Rust 中:

fn algo<I: Iterator>(i: I)

那里的“隐式使用的模板参数”是如此隐含,以至于它甚至不是特质声明 https://doc.rust-lang.org/src/core/iter/traits/iterator.rs.html#96-3214,它也隐含在那里:

pub trait Iterator { ... }

因此,即使使用较长形式的语法,您也会写where I: Iterator而在 C++ 中你仍然会写requires range<R>.

这与原来的问题并不严格相关,但我只是觉得添加其他颜色很有趣。

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

C++ 概念复合了需求和返回类型需求 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 在 Dart 中使用“this”关键字是什么意思?

    如果这听起来像是一个极其愚蠢的问题 我很抱歉 但它确实一直困扰着我 什么是 这个 我看到了吗 每当我看到 flutter 中的文档时 我都会看到它被用于文档中的以下内容 this initialRoute this onGenerateRo
  • 如何给UIButton的按钮文本添加下划线?

    文本来自数据库 我想将它用作按钮并在按钮的文本下划线 我怎样才能做到这一点 在 iOS 6 中 NS属性字符串用于修改文本 您可以使用 NSMutableAttributedString 使用单个 UIButton 或 UILabel 进行
  • Internet Explorer 上使用大括号的 AngularJS 数据绑定问题

    我在这里做错了什么 我已经读过IE兼容性指南 http docs angularjs org guide ie但这没有提到使用 标签进行数据绑定 这在其他浏览器上工作正常 但在 IE 包括 IE9 中失败 http jsfiddle net
  • elm 中的类型继承

    我想要实现的是类型继承 我的意思是 我希望能够让函数返回 子类型 然后让函数返回 超类型 让我举一个例子 假设我有一个主视图组件 它返回一个 Html Msg view Model gt Html Msg view model div cl
  • Oracle 会淘汰 10gAS 转而采用 WebLogic 吗?

    Oracle 购买了 BEA 及其 WebLogic 工具套件 他们在自己的 10gAS 应用服务器中仍然有竞争产品 两者都是Java EE http en wikipedia org wiki Java Platform Enterpri
  • 如何以编程方式替换/更改图像按钮android

    我的视图上有一个图像按钮 我需要在用户交互后更改它 我没有找到类似的东西myImageButton setDrawable这是我想要更改的按钮的 xml
  • 如何使用 Gradle 创建发布签名的 apk 文件?

    我想让我的 Gradle 构建使用 Gradle 创建一个发布签名的 apk 文件 我不确定代码是否正确或者我在执行时是否缺少参数gradle build 这是我的一些代码build gradle build gradle kts file
  • 全二叉树的叶节点数

    Problem求一棵有 n 个节点的满二叉树的叶节点数 我为上述问题编写了一个递归程序 遍历树并在到达没有子节点的节点时增加叶节点的数量 但由于树是一个完整的二叉树 我认为这会让问题变得更容易 但我不知道如何解决 能否以紧凑的形式 类似于公
  • 如何确定我是否作为控制台应用程序运行? (Win32 上的德尔福)

    我有一个通用单元 可以将一些日志记录到 GExperts Debugger 和 或 OutputDebugString 我将在控制台应用程序中使用它 所以我希望它能够通过输出到标准输出writeln 主要可执行文件已经有 APPTYPE C
  • 如何将XAMPP中的phpMyAdmin升级到最新版本?

    如何在不影响数据库 设置和文件的情况下将XAMPP中的phpMyAdmin升级到最新版本 该网站将对您的目的有用 https www ostraining com blog coding update phpmyadmin https ww
  • 如何强制 Apache 使用最新安装的 PHP 版本

    我使用以下命令从 PHP 版本 5 5 9 1ubuntu4 17 升级到 PHP 5 6 23 1 deb sury org trusty 2 apt get y update add apt repository ppa ondrej
  • 如何使用包内 Excel 文件第一行中指定的列名称?

    谁能告诉我如何更改默认列名称 F1 F2 F3等 将数据从 Excel 源导入到 SSIS 2005 中的 OLEDB 目标时 示例 我的 Excel 电子表格中的数据如下所示 Title ProvinceID DistrictID Con
  • 调试 Windows 服务的更简单方法

    有没有比通过 Windows 服务控制管理器启动服务然后将调试器附加到线程更简单的方法来逐步执行代码 这有点麻烦 我想知道是否有更直接的方法 如果我想快速调试服务 我只需添加一个Debugger Break 在那里 当到达该线时 它会将我带
  • 如何使用ffmpeg的sws_scale()调整图片大小?

    我想使用 ffmpeg 的 func gt sws scale 来调整图片大小 有谁知道该怎么做吗 有这个函数的源码吗 首先你需要创建一个SwsContext 您只需执行一次 struct SwsContext resize resize
  • 暂停新的 BackGroundWorker 直到前一个完成

    我正在努力解决线程问题 问题是当我迭代 foreach 循环时 设置时this Document 应用程序执行登录 这是由事件触发的 需要几秒钟才能完成 在里面worker RunWorkerCompleted方法 我需要执行一些取决于当前
  • 如何在 SQLAlchemy 列/外键混合中指定 PostgreSQL 架构?

    现有的 PostgreSQL 数据库具有以不同 模式 组织的表 以分割大型数据库 既用于扩展 又在服务器级别实现微调的安全性 同样 declarative base 表描述被组织在包中的不同文件中 每个模式一个文件 package init
  • 类似 IOS 7 天气 APP 的过渡/动画

    我想实现iOS天气应用程序 如转换 ListView 点击列表项它会展开到详细视图 或者捏合列表也会展开到详细视图 左右滑动过渡 请让我知道如何实施 提前致谢 Here is 我在博客上找到的一些帖子 http www teehanlax
  • 如何使用scrapy将多个页面的数据收集到单个数据结构中

    我正在尝试从站点中抓取数据 数据被构造为多个对象 每个对象都有一组数据 例如 人员的姓名 年龄和职业 我的问题是这些数据在网站中分为两个级别 例如 第一页是姓名和年龄的列表 其中包含指向每个人的个人资料页面的链接 他们的个人资料页面列出了他
  • 如何知道 Visual Studio 中定义某个宏的位置

    我目前有一个使用 DirectX 的视觉工作室项目 代码中有一些宏 例如 range 0 m lBatchSize LONG m nBatched field ecount opt m lBatchSize IMediaSample m p
  • C++ 概念复合了需求和返回类型需求

    上次我将 C 概念与 GCC 和 fconcepts 标志一起使用时 以下代码片段曾经起作用 template