首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::ranges::view_interface使用CRTP的原因

std::ranges::view_interface使用CRTP的原因
EN

Stack Overflow用户
提问于 2021-02-08 01:27:48
回答 1查看 247关注 0票数 2

根据cp首选项,使用奇怪的递归模板模式(CRTP)定义视图view_interface的助手类模板。

他们背后的设计理念是什么?与重写派生类中的虚拟基类方法相比,是否有显著的优势?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-08 02:16:06

如果您给出一个基类虚拟函数,那么它就具有这些函数。一直都是。它永远不可能没有这些函数,从它派生的每个类都将继承这些函数。

view_interface有一个empty函数当且仅当类型的范围类别是forward_range。也就是说,如果empty返回前向迭代器,则begin存在,而end返回该迭代器的前哨。但是,如果可以查询派生类的属性,则只能对其进行测试。基类不能这么做..。除非您允许它将派生类类型赋予它。这意味着它必须是一个模板参数,并且基类是一个模板。

因此,你使用的是CRTP。

提供公共函数或不基于派生范围类的迭代器类别是该类的全部要点。唯一的选择是为每个迭代器类型拥有一组基类。因此,forward_view_interface用于前向范围,contiguous_view_interface用于连续范围,等等,这将是痛苦的。但是它将开始经历乘性爆炸,因为view_interface提供的一些属性与迭代器类别正交。

例如,如果范围是一个大小范围,则提供size。但这可能发生在任何迭代器类别,甚至输入迭代器。因此,您现在需要sized_forward_view_interface等。

或者你可以直接使用CRTP。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66094846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档