根据cp首选项,使用奇怪的递归模板模式(CRTP)定义视图view_interface的助手类模板。
他们背后的设计理念是什么?与重写派生类中的虚拟基类方法相比,是否有显著的优势?
发布于 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。
https://stackoverflow.com/questions/66094846
复制相似问题