c++ - 为什么 std::ranges::view_interface 使用 CRTP

根据cppreference,定义 View 的辅助类模板view_interface使用奇怪的循环模板模式 (CRTP) 技术。

它们背后的设计理念是什么?与在派生类中覆盖虚拟基类方法相比,是否有显着优势?

最佳答案

如果你给一个基类虚函数,那么它就有那些函数。总是。它永远具有这些功能,并且从它派生的每个类都将继承这些功能。

view_interface 有一个 empty 函数当且仅当类型的范围类别是 forward_range 时。也就是说,如果 begin 返回前向迭代器,并且 end 返回该迭代器的标记,则 empty 存在。但是您只能测试是否可以查询派生类的属性。基类不能这样做......除非你通过给它派生类类型来允许它。这意味着它必须是一个模板参数,基类是一个模板。

因此,您正在使用 CRTP。

根据派生范围类的迭代器类别提供或不提供公共(public)功能是该类的整点。唯一的选择是为每种迭代器类型设置一组基类。因此,您需要 forward_view_interface 用于前向范围,contiguous_view_interface 用于连续范围,等等。这会很痛苦。但它会开始经历乘法爆炸,因为 view_interface 提供的一些属性与迭代器类别正交。

例如,如果范围是大小范围,则提供 size。但这可能发生在任何迭代器类别中,甚至是输入迭代器。所以你现在需要 sized_forward_view_interface

或者您可以只使用 CRTP。

https://stackoverflow.com/questions/66094846/

相关文章:

javascript - React App - 我的警告窗口出现两次

swift - 如何使用 SwiftUI 中的扩展将 Hashable 协议(protocol)添加

c++ - 自动类型检测是否只查看一个语句

flutter - 具有动态高度的动画容器 Flutter

python - 将 seq2seq NLP 模型转换为 ONNX 格式会对其性能产生负面影响吗?

ajax - ASP.NET Core Razor ajax POST 请求数据对象为空

java - 如果有 happens-before 保证,让 "this"在构造函数的最后一个语句中

c# - 如何使用 C# 连接到 Azure 存储表

flutter - 调用者没有执行指定操作的权限

javascript - 使用路由器 "No overload matches this call"