Open kelbon opened 2 years ago
Идея очень интересная и заманчивая. Вот только template/typename нужны чтобы парсер/лексер правильно понимали C++. А парсеры как правило достаточно простые и работают с выражением до ;
, зачастую не понимая семантику. На этом уровне зачастую нет приемлемого для парсинга стейта в котором хранятся данные по концептам.
Нужен прототип, который покажет что затраты на оперативную память не возрастают, что компиляция не замедляется, и что реализовать подобное не очень трудозатратно.
Вот только template/typename нужны чтобы парсер/лексер правильно понимали C++
Да, разумеется, но всё же они знают о декларации некого типа/концепта, по сути компилятору для каждого концепта нужно изобрести тип а также все связанные с этим типом(созданные внутри концепта) специализации и т.д. с ожидаемыми операциями(для них будет известно что это, typename/template и т.д.) и запрещёнными операциями(похоже на = delete) Например
template<typename T>
concept have_no_foo = !requires(std::vector<T> foo) {
foo.break_compilation(5);
};
template<have_no_foo T>
int foo(std::vector<T> vec) {
vec.break_compilation(5);
}
Компилятор в точке определения have_no_foo должен изобрести have_no_fooT и специализацию std::vector
Для этого правда нужно ещё правила объединения требований из контрентов, то есть при || или && между констрентами требования всегда объединяются, при этом может получится, что один констрент требует чтобы идентификатор обозначал X, а другой контрент требует что идентификатор обозначал Y, тогда при || имя становится просто снова неоднозначным(а не ожидаемым), а при && возникает конфликт, приводящий к ошибке компиляции.
Если задуматься, то это эквивалентно наследованию итогового изобретённого типа от двух изобретённых типов констрента А и констрента Б
То есть для constraintA && / || contraintB
struct invented_typeAB : invented_typeA, invented_typeB {};
( с некоторыми небольшими махинациями )
Согласен, выглядит не супер легко, но и профиты немаленькие
Например msvc(интел сенс скорее) уже делает что то похожее(изобретает тип)
Описание: Если разрешить на декларации классов/структур писать концепт и это будет означать, что класс и все специализации класса должны соответствовать этому концепту, то мы получим
Примеры
Или вот другой пример, чего явно не хватает в стандарте - работы с вариадиками(тем более что после добавления в стандарт скорость компиляции подобного кода из-за интринсиков вырастет в сотни раз)