Re: Зачем нужны concept?
От: kov_serg Россия  
Дата: 29.09.20 18:13
Оценка: +4
Здравствуйте, PavelCH, Вы писали:

PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?

Ничего особенного — просто более удобный костыль для метапрограммирования.
Re[3]: Зачем нужны concept?
От: night beast СССР  
Дата: 30.09.20 17:07
Оценка: +3
Здравствуйте, AeroSun, Вы писали:

AS> ппц , реально проще и понятнее статик ассертами обложить, чем "дебажить в уме" что не так пошло

AS>Что-то не то напридумывали...


статик ассерты не участвуют в поиске имен.
что ты там обкладывать собрался?
Re[6]: Зачем нужны concept?
От: Evgeny.Panasyuk Россия  
Дата: 03.10.20 03:12
Оценка: 3 (2)
Здравствуйте, Videoman, Вы писали:

V>Для примера у нас есть класс представляющий эелемент какого-нибудь json элемента и у него конструкторы. Приходится писать так:

V>
V>        template <typename BoolType, std::enable_if_t<is_bool_v<BoolType>, int> = 0>
V>        Element(BoolType value);
V>        template <typename IntType, std::enable_if_t<is_int_v<IntType>, int> = 0>
V>        Element(IntType value);
V>        template <typename UintType, std::enable_if_t<is_uint_v<UintType>, int> = 0>
V>        Element(UintType value);
V>        template <typename FloatType, std::enable_if_t<is_float_v<FloatType>, int> = 0>
V>        Element(FloatType value);
V>        ...
V>

V>С концептами это должно превратиться во что-то типа:
V>
V>        template <BoolType ValueType>
V>        Element(ValueType value);
V>        template <IntType ValueType>
V>        Element(ValueType value);
V>        template <UintType ValueType>
V>        Element(ValueType value);
V>        template <FloatType ValueType>
V>        Element(ValueType value);
V>        ...
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 — там внутри диспатчинг по тэгу итератора, которые вручную частично упорядоченны наследованием, либо например жёстко заданным порядком
Автор: jazzer
Дата: 02.03.10
, либо опять таки можно ввести упорядоченность через if constexpr.
Отредактировано 03.10.2020 3:37 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 03.10.2020 3:34 Evgeny.Panasyuk . Предыдущая версия .
Отредактировано 03.10.2020 3:28 Evgeny.Panasyuk . Предыдущая версия .
Re: Зачем нужны concept?
От: _NN_ www.nemerleweb.com
Дата: 30.09.20 14:40
Оценка: 2 (2)
Здравствуйте, PavelCH, Вы писали:

PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?


Это C++, всё гораздо сложнее

template <typename T>
  requires std::is_standard_layout_v<T>
void fun(T v);
 
template <typename T>
  requires std::is_standard_layout_v<T>
        && std::is_trivial_v<T>
void fun(T v);

fun(1); // compiler error: ambiguous call


template <typename T>
concept standard_layout 
  = std::is_standard_layout_v<T>;
 
template <typename T>
  requires standard_layout<T>
void fun(T v);
 
template <typename T>
  requires standard_layout<T> && std::is_trivial_v<T>
void fun(T v);
 
int main()
{
  fun(1); // Вторая перегрузка так как более точная
}


https://akrzemi1.wordpress.com/2020/03/26/requires-clause/
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Зачем нужны concept?
От: AeroSun  
Дата: 30.09.20 16:35
Оценка: :))
ппц , реально проще и понятнее статик ассертами обложить, чем "дебажить в уме" что не так пошло
Что-то не то напридумывали...
Re[4]: Зачем нужны concept?
От: Videoman Россия https://hts.tv/
Дата: 30.09.20 17:37
Оценка: +2
Здравствуйте, night beast, Вы писали:

NB>

NB>статик ассерты не участвуют в поиске имен.
NB>что ты там обкладывать собрался?

AeroSun конечно не в теме, но толика здравого смысла улавливается. Перефразирую вопрос правильно:
Если например у меня не срабатывает перегрузка какого-то метода где используется concept, а он, например, на целую страницу, как мне понять что пошло не так? Как его "дебажить"?
Re: Зачем нужны concept?
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.10.20 09:42
Оценка: +1 :)
Здравствуйте, PavelCH, Вы писали:

PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?


Чтобы можно было в темплейтах ветвиться по сути, а не по вторичным половым признакам.
Re: Зачем нужны concept?
От: reversecode google
Дата: 29.09.20 18:33
Оценка: 2 (1)
вы не сможете в какой то контейнер подсунуть что попало
если это ограничено концептом
и ошибка из трех страниц уменьшится максимум двумя строками
о том что ваш параметр шаблона не подходит, действует конкретное ограничение и какое именно
Re[3]: Зачем нужны concept?
От: Videoman Россия https://hts.tv/
Дата: 30.09.20 13:05
Оценка: +1
Здравствуйте, PavelCH, Вы писали:

PCH>То есть только контроль ошибок на этапе компиляции? И никакого двойного дна?


Для меня основная фишка в том что теперь все перегрузки будут работать в зависимости от концепта. Т.е. раньше приходилось писать весь это мрак с SFINAE для того что бы правильно подставлялись те ли иные функции, а теперь это не нужно. Т.е. это не только контроль ошибок, т.к. ошибок могло и не быть, а вот методы вызывались не те.
Re[5]: Зачем нужны concept?
От: Videoman Россия https://hts.tv/
Дата: 30.09.20 17:31
Оценка: +1
Здравствуйте, PavelCH, Вы писали:

PCH>То есть, если я правильно понял, используется несколько версий одной и той же функции с разной логикой и подставляются в зависимости от условия requires?

Да. На мой взгляд в этом основная их фишка. Уж очень достает писать кучку std::enable_if<....................................................>

PCH>А где про это можно почитать с примерами? Интересует применение на практике.

Если честно, я пока на С++17 сижу и не успел перевести что-то на С++20 и с синтаксисом концептов детально не разбирался, но слежу за их развитием. Зато, уже успел намаяться с std::enable_if в попытках уточнить или изменить перегрузку и понял что concepts это то чего очень не хватает.

Для примера у нас есть класс представляющий эелемент какого-нибудь json элемента и у него конструкторы. Приходится писать так:
        template <typename BoolType, std::enable_if_t<is_bool_v<BoolType>, int> = 0>
        Element(BoolType value);
        template <typename IntType, std::enable_if_t<is_int_v<IntType>, int> = 0>
        Element(IntType value);
        template <typename UintType, std::enable_if_t<is_uint_v<UintType>, int> = 0>
        Element(UintType value);
        template <typename FloatType, std::enable_if_t<is_float_v<FloatType>, int> = 0>
        Element(FloatType value);
        ...

С концептами это должно превратиться во что-то типа:
        template <BoolType ValueType>
        Element(ValueType value);
        template <IntType ValueType>
        Element(ValueType value);
        template <UintType ValueType>
        Element(ValueType value);
        template <FloatType ValueType>
        Element(ValueType value);
        ...
Зачем нужны concept?
От: PavelCH  
Дата: 29.09.20 17:44
Оценка:
Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?
Нехай щастить
Отредактировано 29.09.2020 17:44 PavelCH . Предыдущая версия .
Re[2]: Зачем нужны concept?
От: PavelCH  
Дата: 29.09.20 18:33
Оценка:
_>Ничего особенного — просто более удобный костыль для метапрограммирования.
То есть только контроль ошибок на этапе компиляции? И никакого двойного дна?
Нехай щастить
Re: Зачем нужны concept?
От: YuriV  
Дата: 29.09.20 18:39
Оценка:
Здравствуйте, PavelCH, Вы писали:

PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?


Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.
Re[2]: Зачем нужны concept?
От: σ  
Дата: 29.09.20 20:08
Оценка:
PCH>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?

YV>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.


Бывает такой статус у фич в стандарте?
Re[3]: Зачем нужны concept?
От: Doom100500 Израиль  
Дата: 30.09.20 06:28
Оценка:
Здравствуйте, σ, Вы писали:

PCH>>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?


YV>>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.


σ>Бывает такой статус у фич в стандарте?


Например
Спасибо за внимание
Re[2]: Зачем нужны concept?
От: B0FEE664  
Дата: 30.09.20 08:03
Оценка:
Здравствуйте, reversecode, Вы писали:

R>вы не сможете в какой то контейнер подсунуть что попало

R>если это ограничено концептом
R>и ошибка из трех страниц уменьшится максимум двумя строками
R>о том что ваш параметр шаблона не подходит, действует конкретное ограничение и какое именно

Так ведь есть static_assert
И каждый день — без права на ошибку...
Re[4]: Зачем нужны concept?
От: σ  
Дата: 30.09.20 13:17
Оценка:
PCH>>>>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?

YV>>>Ну тут всё уже расписали. В концептах плохо одно — их нужно было внести ещё в С++11, как просил комитет Страустрап, — включить их хотя бы как экспериментальную фичу.


σ>>Бывает такой статус у фич в стандарте?


D>Например


Я про стандарт спрашивал, при чём тут википедия?
Re[5]: Зачем нужны concept?
От: Doom100500 Израиль  
Дата: 30.09.20 14:52
Оценка:
Здравствуйте, σ, Вы писали:

σ>>>Бывает такой статус у фич в стандарте?


D>>Например


σ>Я про стандарт спрашивал, при чём тут википедия?


Не, ну она ведь описывает стандартную библиотеку. Раз в стандартной библиотеке есть, значит есть и в стандарте, разве нет?
Спасибо за внимание
Re[4]: Зачем нужны concept?
От: PavelCH  
Дата: 30.09.20 15:28
Оценка:
V>Для меня основная фишка в том что теперь все перегрузки будут работать в зависимости от концепта.
О. Это уже что-то. Я знал что есть двойное дно, но не мог его увидеть. То есть, если я правильно понял, используется несколько версий одной и той же функции с разной логикой и подставляются в зависимости от условия requires? А где про это можно почитать с примерами? Интересует применение на практике.
Нехай щастить
Re[5]: Зачем нужны concept?
От: night beast СССР  
Дата: 30.09.20 18:03
Оценка:
Здравствуйте, Videoman, Вы писали:

V>AeroSun конечно не в теме, но толика здравого смысла улавливается. Перефразирую вопрос правильно:

V>Если например у меня не срабатывает перегрузка какого-то метода где используется concept, а он, например, на целую страницу, как мне понять что пошло не так? Как его "дебажить"?

написать эмуляцию

я не говорю что static_assert не нужен, я говорю что предлагать его как альтернативу совсем левой фичи довольно глупо.

PS. перечитал ответ AeroSun, возможно он действительно криво выразил свою мысль. в твоей формулировке смысл имеется.
Отредактировано 30.09.2020 18:05 night beast . Предыдущая версия .
Re[2]: Зачем нужны concept?
От: PavelCH  
Дата: 01.10.20 20:44
Оценка:
Pzz>Чтобы можно было в темплейтах ветвиться по сути, а не по вторичным половым признакам.
Можете расшифровать?
Нехай щастить
Re[7]: Зачем нужны concept?
От: Videoman Россия https://hts.tv/
Дата: 03.10.20 08:34
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ниже пример где уже видно частичное упорядочивание, и без дополнительных трюков на голом enable_if не получится:

EP>
EP>#include <type_traits>
EP>using namespace std;

EP>template<typename T> concept Arithmetic = is_arithmetic_v<T>;
EP>template<typename T> concept Integral = Arithmetic<T> and is_integral_v<T>;

EP>void with_concept(Arithmetic auto){}
EP>void with_concept(Integral auto){}

EP>template<typename T> enable_if_t<is_arithmetic_v<T>> with_sfinae(T){}
EP>template<typename T> enable_if_t<is_arithmetic_v<T> and is_integral_v<T>> with_sfinae(T){}

EP>int main()
EP>{
EP>    with_concept(1);
EP>    with_concept(1.0);
    
EP>    // with_sfinae(1); // error: call of overloaded 'with_sfinae(int)' is ambiguous
EP>    with_sfinae(1.0);
EP>}
EP>

EP>LIVE DEMO
EP>enable_if просто добавляет условие на включение или выключение перегрузки, там нет никакого сравнения специфичности условий. Поэтому в случае with_sfinae(1), когда оба условия сработали, получается неоднозначность.

Да, интересное замечание. Действительно полезное свойство.

EP>До концепций это например решалось через наследование — смотри реализацию std::advance — там внутри диспатчинг по тэгу итератора, которые вручную частично упорядоченны наследованием, либо например жёстко заданным порядком
Автор: jazzer
Дата: 02.03.10
, либо опять таки можно ввести упорядоченность через if constexpr.


Достаточно просто убрать неоднозначность, правда на практике это бывает сложно сделать:
Re[8]: Зачем нужны concept?
От: Evgeny.Panasyuk Россия  
Дата: 03.10.20 09:31
Оценка:
Здравствуйте, Videoman, Вы писали:

EP>>До концепций это например решалось через наследование — смотри реализацию std::advance — там внутри диспатчинг по тэгу итератора, которые вручную частично упорядоченны наследованием, либо например жёстко заданным порядком
Автор: jazzer
Дата: 02.03.10
, либо опять таки можно ввести упорядоченность через if constexpr.

V>Достаточно просто убрать неоднозначность, правда на практике это бывает сложно сделать:

Здесь структура намного сложней — условие enable_if каждой перегрузки зависит от всех других, потому что конечные условия должны быть взаимоисключающими. Например попробуй добавить ещё предикаты is_fundamental и is_unsigned.
Если пытаться без концепций, то всё же if constexpr намного удобнее и лаконичней (конечно там где можно вместо перегрузок использовать один шаблон функции со статическими ветвлениями), так как там можно добавлять else if не дублируя остальные условия, можно делать вложенные ветвления и т.п.
Re: Зачем нужны concept?
От: x-code  
Дата: 05.10.20 18:51
Оценка:
Здравствуйте, PavelCH, Вы писали:

PCH>Пытаюсь понять зачем нужны а с++ концепты. Ну первое что лежит на поверхности это избегание ошибок на этапе генерации. А что ещё? Как практически применять эту штуку? Для чего комитет заседал столько времени? Почему они должны "спасти мир"? Что такого без них нельзя было делать а с ними можно?


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