c++ - C++20 是否改变了自定义点的编写方式?
问题描述
我正在阅读这篇关于 C++17 中自定义点的麻烦的博文,所以我想知道 C++20 中是否对此有任何更改。
我只关心允许我更好地编写我的库的语言更改,我认为std::
由于向后兼容性的原因没有任何更改。
为了使问题自成一体:这是我对帖子中提到的问题的糟糕回顾:
- ADL 舞蹈解决方案很容易出错(例如调用
std::swap
而不是使用std::swap; swap(a,b);
, - 正确的解决方案使用丑陋的样板,包括优先级继承技巧
template<size_t I> struct priority_tag : priority_tag<I-1> {}; template<> struct priority_tag<0> {};
解决方案
在 C++20 之前,“定制点”是一种基于 ADL 的非正式习惯用语,C++ 标准库的各个部分有时会使用它。C++20 创建了一个更正式的习语,具有更直接的实现。
但是 C++20 的适当定制点概念与 C++20 之前的习语相当不兼容。因此,它创建了新的自定义点,这些点在其新规则下运行:std::ranges::begin/end
、std::ranges::size
等。
C++20 自定义点的性质是,您几乎可以在任何版本的 C++ 中使用该惯用语。C++20 的概念使编写自定义版本更容易,但是您可以在大多数 C++ 版本中使用 SFINAE 中的一些内容来完成基本相同的事情。
C++20 自定义点是函数对象,而不是常规的模板函数。因此,您不能重载函数本身。您可以使用成员函数或 ADL 可访问函数自定义自定义点,两者都必须使用所需的名称和接口。但这也意味着您不能自定义非用户定义的类型;自定义点类型本身必须为此类函数提供任何重载。
两者之间的主要不兼容在于调用自定义点,而不是如何自定义它。没有必要using
跳舞。
推荐阅读
- sql - 获取日期范围内不连续的行
- json - 如何将 JSON 数组值传递到 Jasper Reports 子报表中?
- reporting-services - 创建一个表达式来添加和减去两个独立查找表达式的值
- tensorflow - 为什么在我使用 XLA_FLAGS 转储 ptx 和 llvm 时没有为矩阵乘法张量流操作生成 PTX?
- android - 有没有办法阻止我的应用在特定时间范围内发送通知?
- google-cloud-platform - 托管简单节点服务器和网站的最便宜方式,在 Google Cloud Platform 上的每日浏览量很少
- javascript - 配置json数据有问题,有点卡住
- snakemake - 尝试为工作流创建目录时发生 ChildIOException [Snakemake]
- javascript - 地理编码器、传单和功能范围的问题
- flutter - 如何获取 ListTile 中的行 ID 或行号?