LWG3549 предлагает view_interface<D>
не должен наследовать view_base
, что позволяет адаптерам диапазона лучше выполнять пустую базовую оптимизацию.
В последнем [range.view] определение понятия view
было изменено. следующие изменения:
template<class T>
concept view =
range<T> && movable<T> && enable_view<T>;
template<class T>
inline constexpr bool is-derived-from-view-interface = see below; // exposition only
template<class T>
inline constexpr bool enable_view =
derived_from<T, view_base> || is-derived-from-view-interface<T>;
Где is-derived-from-view-interface
определяется как:
Для типа
T
is-derived-from-view-interface<T>
являетсяtrue
тогда и только тогда, когдаT
имеет ровно один общедоступный базовый классview_interface<U>
для некоторого типаU
, аT
не имеет базовых классов типаview_interface<V>
для любого другого типаV
.
Определение этой встроенной переменной выглядит следующим образом:
#include <ranges>
template<class D>
concept is_derived_from_view_interface =
std::derived_from<D, std::ranges::view_interface<D>>;
static_assert(is_derived_from_view_interface<std::ranges::iota_view<int>>);
Но D
не обязан наследовать view_interface<D>
, он может наследовать view_interface<U>
для некоторого произвольного типа U
, и нам также нужно определить, наследует ли D
другой view_interface<V>
, где V
не равно U
.
Итак, как правильно определить этот is-derived-from-view-interface
?