Здравствуйте, johny5, Вы писали:
J>Привет.
J>У меня в голове болтается смутное ощущение что новые конструкции типа constexpr, f(auto arg), decltype, if contexpr и concept сводят на нет необходимость старого синтаксиса шаблонов через template<typename .. >, SFINAE и проче с ним, нет?
Нет. SFINAE совершенно точно нет, ибо это краеугольный камень на котором и стоят в частности концепты
и всё остальное. Потом самое важное свойство шаблона -- способность специализации класса, когда его
содержимое меняется в зависимости от типа аргумента. Все новые конструкции в этом ничем не помогут.
J> Пока только рассматриваем функции — структуры, видимо, пока ещё требуют старый синтаксис.
Мне нужны совершенно разные функции в зависимости от аргументов. Что делать? Опять же
с помощью enable_if (SFINAE) я могут написать разные шаблоны. Специализации уже не могу,
да не важно. А новые конструкции ни чем не помогают.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, reversecode, Вы писали:
R>>есть еще не помню кейс где SFINAE не будет работать R>>а концепт будет
R>А у SFINAE другая проблема: у него все перегрузки равноправны и нет способа сделать одну перегрузку "более специальной", чем другая.
Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)
R> И иногда резолвить коллизии становится достаточно геморройно.
А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?
Здравствуйте, fk0, Вы писали:
fk0> Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)
Так это не свойство самого SFINAE, а один из способов преодоления его ограничений. И этот способ зачастую просто разворачивает грабли обратным концом — рано или поздно найдется тип, или семейство типов, для которых более приоритетная перегрузка окажется менее подходяещей, чем менее приоритетная. Таким образом, этот фокус имеет тенденцию еще больше все усложнять и усугублять проблему.
fk0> А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?
Так вот это самое прописывание как раз и сопряжено с геморроем, после накопления определенной критической массы перегрузок.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, fk0, Вы писали:
R>> И иногда резолвить коллизии становится достаточно геморройно.
fk0> А может наоборот, это препятствует возможным ошибкам и заставляет прописывать взаимо-исключающие условия в шаблонах?
К сожалению, в С++ правила разрешения
— не одинаковые (для шаблонов классов, шаблонов функций и перегрузок функций)
— связаны разной с областью видимости (для шаблонов классов, для свободных функций и для членов класса) — и, как следствие, с разной степенью монолитности
— на практике реализуются через разный синтаксис, включая лайфхаки (enable_if, void_t, if constexpr, requires)
Конечно, можно изобрести N+1-й лайфхак, который будет, например, монолитным и/или упорядоченным в естественном порядке.
Но хотелось бы чего-то красивого и стандартного, которое радовало бы глаз прямо из коробки.
concept / requires — это первое приближение к усладе глаз.
Здравствуйте, rg45, Вы писали:
fk0>> Ну да конечно. Масса разных способов. Можно сделать с числовым приоритетом (сколько раз шаблон развернётся...)
R>Так это не свойство самого SFINAE, а один из способов преодоления его ограничений. И этот способ зачастую просто разворачивает грабли обратным концом — рано или поздно найдется тип, или семейство типов, для которых более приоритетная перегрузка окажется менее подходяещей, чем менее приоритетная. Таким образом, этот фокус имеет тенденцию еще больше все усложнять и усугублять проблему.
SFINAE — это как раз фундаментальное свойство.
"Как удалять неподходящие перегрузки/специализации и не сломать компиляцию".
А вот "как среди подходящих выбрать наилучшую" — это уже что-то из области Substitution SUCCESS Is An Expectation %)