cpp-ru / ideas

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

Краткий синтаксис для ограничения шаблонных шаблонных аргументов концептами #478

Open Mrkol opened 2 years ago

Mrkol commented 2 years ago

Так сейчас можно:

template<class Derived, class Base>
concept DerivedFrom = std::derived_from<Derived, Base>;

template<DerivedFrom<NiceClass> T>
void foo(T t) { ... }

А вот так нельзя:

template<template<class...> class Template, class... Ts>
concept Instantiatible = requires { typename Template<Ts...>; };

// ошибка: краткий синтаксис работает только с концептами над типами
template<Instantiatible<int, float, bool> Template>
void foo(Template<int, float, bool> t) { ... }

Пример конечно тривиальный, но "в жизни" это тоже бывает полезно. При параметризации кода по контейнеру для данных часто нужен любой контейнер, обладающий какими-то свойствами (например любой упорядоченный ассоциативный контейнер). Ещё один юзкейс -- policy based design, где политики обычно являются шаблонами, удовлетворяющими каким-либо свойствам. В обоих случаях приятнее сразу писать какой именно шаблон нужен, а не дописывать всё повторно в requires-clause. С ходу в голову не приходит хороших причин, почему для типов этот сахар поддерживается, а для других сущностей -- нет.

Аналогичная ситуация наблюдается и с нетиповыми шаблонными аргументами вроде целых чисел, однако не уверен, что их поддержка имеет практический смысл.