Re: template (синтаксис) больше не нужен?
От: fk0 Россия https://fk0.name
Дата: 08.11.23 10:45
Оценка:
Здравствуйте, johny5, Вы писали:

J>Привет.


J>У меня в голове болтается смутное ощущение что новые конструкции типа constexpr, f(auto arg), decltype, if contexpr и concept сводят на нет необходимость старого синтаксиса шаблонов через template<typename .. >, SFINAE и проче с ним, нет?


Нет. SFINAE совершенно точно нет, ибо это краеугольный камень на котором и стоят в частности концепты
и всё остальное. Потом самое важное свойство шаблона -- способность специализации класса, когда его
содержимое меняется в зависимости от типа аргумента. Все новые конструкции в этом ничем не помогут.

J> Пока только рассматриваем функции — структуры, видимо, пока ещё требуют старый синтаксис.


Мне нужны совершенно разные функции в зависимости от аргументов. Что делать? Опять же
с помощью enable_if (SFINAE) я могут написать разные шаблоны. Специализации уже не могу,
да не важно. А новые конструкции ни чем не помогают.
Re[5]: template (синтаксис) больше не нужен?
От: fk0 Россия https://fk0.name
Дата: 08.11.23 10:49
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, reversecode, Вы писали:


R>>есть еще не помню кейс где SFINAE не будет работать

R>>а концепт будет

R>А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая.


Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)

R> И иногда резолвить коллизии становится достаточно геморройно.


А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?
Re[6]: template (синтаксис) больше не нужен?
От: rg45 СССР  
Дата: 08.11.23 19:46
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)


Так это не свойство самого SFINAE, а один из способов преодоления его ограничений. И этот способ зачастую просто разворачивает грабли обратным концом — рано или поздно найдется тип, или семейство типов, для которых более приоритетная перегрузка окажется менее подходяещей, чем менее приоритетная. Таким образом, этот фокус имеет тенденцию еще больше все усложнять и усугублять проблему.

fk0> А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?


Так вот это самое прописывание как раз и сопряжено с геморроем, после накопления определенной критической массы перегрузок.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 08.11.2023 19:58 rg45 . Предыдущая версия . Еще …
Отредактировано 08.11.2023 19:53 rg45 . Предыдущая версия .
Отредактировано 08.11.2023 19:52 rg45 . Предыдущая версия .
Re[6]: template (синтаксис) больше не нужен?
От: Кодт Россия  
Дата: 16.11.23 12:17
Оценка:
Здравствуйте, fk0, Вы писали:

R>> И иногда резолвить коллизии становится достаточно геморройно.


fk0> А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?


К сожалению, в С++ правила разрешения
— не одинаковые (для шаблонов классов, шаблонов функций и перегрузок функций)
— связаны разной с областью видимости (для шаблонов классов, для свободных функций и для членов класса) — и, как следствие, с разной степенью монолитности
— на практике реализуются через разный синтаксис, включая лайфхаки (enable_if, void_t, if constexpr, requires)

Конечно, можно изобрести N+1-й лайфхак, который будет, например, монолитным и/или упорядоченным в естественном порядке.
Но хотелось бы чего-то красивого и стандартного, которое радовало бы глаз прямо из коробки.

concept / requires — это первое приближение к усладе глаз.
Перекуём баги на фичи!
Re[7]: template (синтаксис) больше не нужен?
От: Кодт Россия  
Дата: 16.11.23 12:22
Оценка:
Здравствуйте, rg45, Вы писали:

fk0>> Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)


R>Так это не свойство самого SFINAE, а один из способов преодоления его ограничений. И этот способ зачастую просто разворачивает грабли обратным концом — рано или поздно найдется тип, или семейство типов, для которых более приоритетная перегрузка окажется менее подходяещей, чем менее приоритетная. Таким образом, этот фокус имеет тенденцию еще больше все усложнять и усугублять проблему.


SFINAE — это как раз фундаментальное свойство.
"Как удалять неподходящие перегрузки/специализации и не сломать компиляцию".

А вот "как среди подходящих выбрать наилучшую" — это уже что-то из области Substitution SUCCESS Is An Expectation %)
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.