为什么 std::ranges::view_interface 使用 CRTP

Why std::ranges::view_interface using CRTP

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

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

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

当且仅当类型的范围类别为 forward_range 时,

view_interface 具有 empty 函数。也就是说,如果 begin returns 是前向迭代器,并且 end returns 是该迭代器的哨兵,则 empty 存在。但是您只能测试是否可以查询派生 class 的属性。基础 class 不能这样做......除非你通过给它派生的 class 类型来允许它。这意味着它必须是一个模板参数,base class 是一个模板。

因此,您正在使用 CRTP。

根据派生范围class的迭代器类别是否提供公共函数是class的整点。唯一的选择是为每个迭代器类型设置一组基 classes。因此,前向范围需要 forward_view_interface,连续范围需要 contiguous_view_interface,等等。这会很痛苦。但它会开始经历乘法爆炸,因为 view_interface 提供的某些属性与迭代器类别正交。

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

或者您可以只使用 CRTP。