Здравствуйте, PavelCH, Вы писали:
PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Ничего особенного — просто более удобный костыль для метапрограммирования.
Здравствуйте, AeroSun, Вы писали:
AS> ппц , реально проще и понятнее статик ассертами обложить, чем "дебажить в уме" что не так пошло AS>Что-то не то напридумывали...
статик ассерты не участвуют в поиске имен.
что ты там обкладывать собрался?
Здравствуйте, Videoman, Вы писали:
V>Для примера у нас есть класс представляющий эелемент какого-нибудь json элемента и у него конструкторы. Приходится писать так: V>
В этом примере не раскрывается основная фишка концепций в плане overload resolution, а именно частичное упорядочивание требований по степени специфичности (после нормализации). Да, во втором варианте меньше буков, но по структурной сложности одно и то же.
(Как альтернатива, в C++17 можно это же сделать всё внутри одного метода через if constexpr — структурная сложность всё равно подобная, но всё же проще и лаконичнее чем enable_if)
Ниже пример где уже видно частичное упорядочивание, и без дополнительных трюков на голом enable_if не получится:
#include <type_traits>
using namespace std;
template<typename T> concept Arithmetic = is_arithmetic_v<T>;
template<typename T> concept Integral = Arithmetic<T> and is_integral_v<T>;
void with_concept(Arithmetic auto){}
void with_concept(Integral auto){}
template<typename T> enable_if_t<is_arithmetic_v<T>> with_sfinae(T){}
template<typename T> enable_if_t<is_arithmetic_v<T> and is_integral_v<T>> with_sfinae(T){}
int main()
{
with_concept(1);
with_concept(1.0);
// with_sfinae(1); // error: call of overloaded 'with_sfinae(int)' is ambiguous
with_sfinae(1.0);
}
LIVE DEMO
enable_if просто добавляет условие на включение или выключение перегрузки, там нет никакого сравнения специфичности условий. Поэтому в случае with_sfinae(1), когда оба условия сработали, получается неоднозначность.
До концепций это например решалось через наследование — смотри реализацию std::advance — там внутри диспатчинг по тэгу итератора, которые вручную частично упорядоченны наследованием, либо например жёстко заданным порядком
Здравствуйте, PavelCH, Вы писали:
PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Здравствуйте, night beast, Вы писали:
NB> NB>статик ассерты не участвуют в поиске имен. NB>что ты там обкладывать собрался?
AeroSun конечно не в теме, но толика здравого смысла улавливается. Перефразирую вопрос правильно:
Если например у меня не срабатывает перегрузка какого-то метода где используется concept, а он, например, на целую страницу, как мне понять что пошло не так? Как его "дебажить"?
Здравствуйте, PavelCH, Вы писали:
PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Чтобы можно было в темплейтах ветвиться по сути, а не по вторичным половым признакам.
вы не сможете в какой то контейнер подсунуть что попало
если это ограничено концептом
и ошибка из трех страниц уменьшится максимум двумя строками
о том что ваш параметр шаблона не подходит, действует конкретное ограничение и какое именно
Здравствуйте, PavelCH, Вы писали:
PCH>То есть только контроль ошибок на этапе компиляции? И никакого двойного дна?
Для меня основная фишка в том что теперь все перегрузки будут работать в зависимости от концепта. Т.е. раньше приходилось писать весь это мрак с SFINAE для того что бы правильно подставлялись те ли иные функции, а теперь это не нужно. Т.е. это не только контроль ошибок, т.к. ошибок могло и не быть, а вот методы вызывались не те.
Здравствуйте, PavelCH, Вы писали:
PCH>То есть, если я правильно понял, используется несколько версий одной и той же функции с разной логикой и подставляются в зависимости от условия requires?
Да. На мой взгляд в этом основная их фишка. Уж очень достает писать кучку std::enable_if<....................................................>
PCH>А где про это можно почитать с примерами? Интересует применение на практике.
Если честно, я пока на С++17 сижу и не успел перевести что-то на С++20 и с синтаксисом концептов детально не разбирался, но слежу за их развитием. Зато, уже успел намаяться с std::enable_if в попытках уточнить или изменить перегрузку и понял что concepts это то чего очень не хватает.
Для примера у нас есть класс представляющий эелемент какого-нибудь json элемента и у него конструкторы. Приходится писать так:
Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
_>Ничего особенного — просто более удобный костыль для метапрограммирования.
То есть только контроль ошибок на этапе компиляции? И никакого двойного дна?
Здравствуйте, PavelCH, Вы писали:
PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.
PCH>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
YV>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.
Здравствуйте, σ, Вы писали:
PCH>>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
YV>>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.
σ>Бывает такой статус у фич в стандарте?
Здравствуйте, reversecode, Вы писали:
R>вы не сможете в какой то контейнер подсунуть что попало R>если это ограничено концептом R>и ошибка из трех страниц уменьшится максимум двумя строками R>о том что ваш параметр шаблона не подходит, действует конкретное ограничение и какое именно
PCH>>>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
YV>>>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.
σ>>Бывает такой статус у фич в стандарте?
D>Например
V>Для меня основная фишка в том что теперь все перегрузки будут работать в зависимости от концепта.
О. Это уже что-то. Я знал что есть двойное дно, но не мог его увидеть. То есть, если я правильно понял, используется несколько версий одной и той же функции с разной логикой и подставляются в зависимости от условия requires? А где про это можно почитать с примерами? Интересует применение на практике.
Здравствуйте, Videoman, Вы писали:
V>AeroSun конечно не в теме, но толика здравого смысла улавливается. Перефразирую вопрос правильно: V>Если например у меня не срабатывает перегрузка какого-то метода где используется concept, а он, например, на целую страницу, как мне понять что пошло не так? Как его "дебажить"?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Ниже пример где уже видно частичное упорядочивание, и без дополнительных трюков на голом enable_if не получится: EP>
EP>LIVE DEMO EP>enable_if просто добавляет условие на включение или выключение перегрузки, там нет никакого сравнения специфичности условий. Поэтому в случае with_sfinae(1), когда оба условия сработали, получается неоднозначность.
Да, интересное замечание. Действительно полезное свойство.
EP>До концепций это например решалось через наследование — смотри реализацию std::advance — там внутри диспатчинг по тэгу итератора, которые вручную частично упорядоченны наследованием, либо например жёстко заданным порядком
, либо опять таки можно ввести упорядоченность через if constexpr. V>Достаточно просто убрать неоднозначность, правда на практике это бывает сложно сделать:
Здесь структура намного сложней — условие enable_if каждой перегрузки зависит от всех других, потому что конечные условия должны быть взаимоисключающими. Например попробуй добавить ещё предикаты is_fundamental и is_unsigned.
Если пытаться без концепций, то всё же if constexpr намного удобнее и лаконичней (конечно там где можно вместо перегрузок использовать один шаблон функции со статическими ветвлениями), так как там можно добавлять else if не дублируя остальные условия, можно делать вложенные ветвления и т.п.
Здравствуйте, PavelCH, Вы писали:
PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Наконец-то ввели в шаблоны статическую типизацию или каклй-то ее аналог.
А статическая типизация это всегда хорошо.