Как правильно определить is-derived-from-view-interface?

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?


person 康桓瑋    schedule 05.08.2021    source источник


Ответы (1)


Эта формулировка означает использование шаблонного вывода аргумента.

template <class D>
void test(view_interface<D>&);

template <class R>
concept is_derived_from_view_interface = requires (R& r){ (test)(r); };

person T.C.    schedule 05.08.2021
comment
Аккуратный! Однако я не вижу, как это обрабатывает ровно один общедоступный базовый класс. Я что-то упускаю? - person Frank; 05.08.2021
comment
@Frankv - больше 1 = неоднозначное преобразование - person StoryTeller - Unslander Monica; 05.08.2021
comment
@StoryTeller-UnslanderMonica Спасибо, это имеет смысл. - person Frank; 05.08.2021
comment
@HTNW - он не будет принимать определяемое пользователем преобразование. Только производный класс может соответствовать спецификации базового шаблона. Определяемые пользователем преобразования не учитываются при вычете аргументов шаблона. - person StoryTeller - Unslander Monica; 05.08.2021
comment
Следующий вопрос должен заключаться в том, когда такая форма концепции стала популярна? :) - person 康桓瑋; 06.08.2021