cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Проверка, что один concept специализированнее другого #365

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +1, -0 Автор идеи: Andrey Davydov

Над концептами определен частичный порядок, который влияет на выбор лучшего кандидата в overload resolution, специализации класса и т.д. Правила сравнения концептов нетривиальны, так что читая код убедиться в уме, что P subsume Q довольны сложно, куда надежнее будет написать static_assert(__subsume(P, Q)).

Добавить в язык "concept trait" subsume(...) ожидающий 2 (альтернативный вариант: >= 2) концепта. Аналогично уже имеющимся во всех популярных компиляторах (но не стандартизированным) type traits is_final, is_base_of, is_constructible, __is_convertible, и т.д.

Пример использования:

template<typename It> concept InputIterator = ...;
template<typename It> concept ForwardIterator = ...;
template<typename It> concept BidirectionalIterator = ...;
template<typename It> concept RandomAccessIterator = ...;

static_assert(__subsume(ForwardIterator, InputIterator));
static_assert(__subsume(BidirectionalIterator, ForwardIterator));
static_assert(__subsume(RandomAccessIterator, BidirectionalIterator));

// альтернативный подход:
static_assert(__subsume(RandomAccessIterator,
                        BidirectionalIterator,
                        ForwardIterator,
                        InputIterator));

Поддержать __subsume на стороне компилятора очень просто -- упорядочивание концептов это операция которая компилятору в любом случае нужна.

Синтаксис "__subsume(...)", возможно, не самый удачный, так как в данный момент нет прецендентов в стандарте C++, но de facto в популярных компиляторах уже есть builtin type traits, которые парсятся как выражения, так что добавить concept trait должно быть не сложно.

apolukhin commented 3 years ago

yndx-antoshkka, 9 октября 2018, 16:58 Идея хорошая, но с ней придётся подождать. На данный момент функционал концептов для C++20 определён (идут разговоры о terse syntax, это наверное последнее что смогут добавить к C++20).

Надо дождаться C++20, и уже тогда приниматься за proposal.