2

根据 cppreference,view_interface使用奇怪重复模板模式 (CRTP) 技术定义视图的帮助类模板。

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

4

1 回答 1

10

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

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

因此,您使用的是 CRTP。

基于派生范围类的迭代器类别是否提供通用功能是该类的全部要点。唯一的选择是为每个迭代器类型设置一堆基类。所以你有forward_view_interface前向范围,contiguous_view_interface连续范围等。那会很痛苦。但它会开始经历乘法爆炸,因为 提供的某些属性view_interface与迭代器类别正交。

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

或者你可以只使用 CRTP。

于 2021-02-08T02:16:06.540 回答