为什么std::ranges::view_interface使用CRTP
根据 cppreference,帮助类模板view_interface
使用奇怪的重复模板模式 (CRTP) 技术定义视图。
它们背后的设计理念是什么?与覆盖派生类中的虚拟基类方法相比,是否有显着的优势?
回答
如果你给一个基类虚函数,那么它就有那些函数。总是。它永远不可能没有这些函数,从它派生的每个类都将继承这些函数。
view_interface
具有empty
当且仅当类型的范围类别为 的函数forward_range
。也就是说,empty
如果begin
返回前向迭代器,则存在,并end
返回该迭代器的哨兵。但是您只能测试是否可以查询派生类的属性。基类不能这样做......除非你通过给它派生类类型来允许它。这意味着它必须是模板参数,而基类是模板。
因此,您使用的是 CRTP。
提供共同的功能或不基于所导出的范围类的迭代器分类是整个点的类。唯一的选择是为每个迭代器类型拥有一堆基类。所以你有forward_view_interface
前向范围,contiguous_view_interface
连续范围等。这会很痛苦。但是它会开始经历乘法爆炸,因为 提供的一些属性view_interface
与迭代器类别正交。
例如size
,如果范围是调整大小的范围,则提供。但这可能发生在任何迭代器类别中,甚至是输入迭代器。所以你现在需要sized_forward_view_interface
,等等。
或者您可以只使用 CRTP。