пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе.
Не понимаю, как всё это использовать, например:
Концепт SemiRegular
Тип X является semiregular, если он поддерживает большую шестерку функций
(Big Six) и операцию swap. Большая шестерка состоит из следующих функций:
конструктор по умолчанию X();
конструктор копирования X ( const X& );
оператор присваивания X& operator ( const X& );
конструктор перемещения X ( X&& );
оператор перемещения X& operator = ( X&& );
деструктор ~X().
Дополнительно к этому должна быть определена операция swap(X&, X&).
Благодаря библиотеке свойств типов1
определить соответствующий концепт легко. Для начала я определю свойство типа isSemiRegular и затем использую его для определения концепта SemiRegular.
1 template<typename T>
2 struct isSemiRegular: std::integral_constant<bool,
3 std::is_default_constructible<T>::value &&
4 std::is_copy_constructible<T>::value &&
5 std::is_copy_assignable<T>::value &&
6 std::is_move_constructible<T>::value &&
7 std::is_move_assignable<T>::value &&
8 std::is_destructible<T>::value &&
9 std::is_swappable<T>::value >{};
10
11
12 template<typename T>
13 concept SemiRegular = isSemiRegular<T>::value;
Здравствуйте, wl., Вы писали:
wl.>пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе. wl.>Не понимаю, как всё это использовать wl.>Что это такое? где это применяется? и так повсюду
попробуй ChatGPT поспрашивать, он хоть иногда и по всякому магазинному хламу галлюцинирует (по реальным и эксплуатационным характеристикам, вплоть до прямо противоположного) — но с кодом часто неплохо шарит (в т.ч. и если свои куски кода ему показывать и задавать вопросы), может даже и небольшие аппликухи почти безошибочно писать
wl.>а на русский эту книгу переводили? боюсь еще больше запутаться при чтении оригинала
скорее всего нет, книга 2023 года издания.
(сейчас вообще что-то официально переводят на русский?).
А концепты, если я не ошибаюсь, в C++20 окончательно вошли.
Но там изложение несложным языком с примерами.
Для сравнения у Страуструпа в "Programming Principles and Practice Using C++ (2024, Addison-Wesley Professional)" про концепты всего 2 страницы.
(хотя может оно так и нужно, учитывая тот факт, что концепты нужны только тем, кто активно пишет свои шаблоны)
Здравствуйте, wl., Вы писали:
wl.>пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе.
Просто и по-русски.
Концепты — это ограничения на C++ шаблоны. Раньше шаблоны были без ограничений, но при помощи техники SFINAE можно было проверить тип на присутствие определённых свойств.
Концептами можно декларативно описать ограничения типа (можно вызвать метод / копируемых / число / строка, и т.д);
Штука очень полезная, если пишешь библиотечный или утилитарный код. Стоит изучить.
Ну а поскольку в плюсах всё простое быстро становится сложным, то концептами можно описать любые фантазии, и сами концепты превратились в ещё один над-язык, но, тем не менее, простые ограничения писать удобно.
ПС.
Поиск c++ concepts по-началу приводил к филосовским статьям .
Здравствуйте, wl., Вы писали:
wl.>Что это такое? где это применяется? и так повсюду
"Что это" в вашем вопросе относится к чему? К концептам самим по себе или же конкретно к концепту SemiRegular?
Если к концептам, то концепты предназначены для описания ограничений параметров шаблонов в C++.
Можно сказать, что концепты добавляют в C++ то, что в C# или в Rust-е реализуется посредством where.
Типа если в C# написано:
public T AddEC<T>() where T : EntityComponent, ... {...}
то в C++ может быть написано как:
template<typename T>
requires EntityComponet<T>
T AddEC() {...}
Основных применений у C++ных концептов сейчас два (может более опытные в современном C++ добавят еще сценариев):
1. Описание ограничений, которым должен соответствовать параметр шаблона. Например, у нас может быть концепт Addable, который накладывает требование наличия операции сложения для типа T. И мы можем написать функцию add требуя, чтобы ее параметры удовлетворяли концепту Addable:
template<typename T>
concept Addable = ...;
template<typename T>
requires Addable<T>
auto add(const T & a, const T & b) {...};
И когда мы в add подсунем аргументы, которые не поддерживают сложения, то вместо простыни ошибок о том, что компилятор не может применить operator+ к чему-то внутри add, мы получим ошибку о том, что функция add не может быть применена, т.к. ее параметры не удовлетворяют концепту.
Попробуйте вот такой пример: https://godbolt.org/z/f77Wr177M
С закомментированной и раскомментированной строчкой requires в определении add.
2. Выбор перегрузки на основании концептов. Т.е. прямая замена техники SFINAE.
Например, вы можете определить функции:
Здравствуйте, wl., Вы писали:
wl.>пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе.
И насколько сильно все эти навороты с концептами и прочими новшествами последних стандартов используются в современных конторах? Насколько надо всё это изучать?
По-моему сейчас больше чем C++17 ничего не требуется нигде.
Знаете, у меня складывается мнение, что вместо изучения последних фич C++, лучше заняться изучением чего-то иного. Например, предметной области. Пользы будет больше.
Здравствуйте, wl., Вы писали:
wl.>пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе.
SeomiRegular-Regular — это наоборот очень старое. Почитай например Alexander Stepanov and Paul McJones: Elements of Programming, ну или любую лекцию из старых заметок Степанова по алгоритмам.
Здравствуйте, andyp, Вы писали:
wl.>>пытаюсь вникнуть в суть нововведений, и почему-то ничего не могу понять, какая-то абстракция, наподобие высшей математики на первом курсе. A>SeomiRegular-Regular — это наоборот очень старое. Почитай например Alexander Stepanov and Paul McJones: Elements of Programming, ну или любую лекцию из старых заметок Степанова по алгоритмам.
ну ясно, получается у меня просто нет соответствующего бэкграунда, или даже хотя бы англоязычной терминологии. Книжку почитаю, откопал на русском
Здравствуйте, jamesq, Вы писали:
J>И насколько сильно все эти навороты с концептами и прочими новшествами последних стандартов используются в современных конторах? Насколько надо всё это изучать? J>По-моему сейчас больше чем C++17 ничего не требуется нигде.
у нас тоже с++20/23 не используется, кажется даже компилятор не поддерживает, но боюсь где-нибудь на собеседованиях всплывет вопрос.
С другой стороны, менять работу страшновато даже, у нас из 25 программистов только я на с++ пишу, похоже другие языки уверенно побеждают в прикладных направлениях
Здравствуйте, wl., Вы писали:
wl.>ну ясно, получается у меня просто нет соответствующего бэкграунда, или даже хотя бы англоязычной терминологии. Книжку почитаю, откопал на русском
Если тебе только про регулярные типы — глава 1.5 в английском издании. Там пара страниц всего. Если коротко, то полурегулярные типы — типы, значения которых ты можешь присваивать и копировать. Регулярные — еще и сравнивать ==.
Здравствуйте, m2user, Вы писали:
wl.>> у нас из 25 программистов только я на с++ пишу, похоже другие языки уверенно побеждают в прикладных направлениях
M>а остальные на чём? M>(ты же вроде системный софт под мобильные устройства пишешь?)
на андроиде котлин, вообще без нативных библиотек jni
серверную часть пишут на python, c#
фронт даже не знаю, вроде бы тоже python
база данных — посгресс со своим языком хранимых процедур.
Всё какое-то ненативное в целом
Здравствуйте, wl., Вы писали:
wl.>С другой стороны, менять работу страшновато даже, у нас из 25 программистов только я на с++ пишу, похоже другие языки уверенно побеждают в прикладных направлениях
Если вы после C++ не в состоянии осилить другой ЯП с другими фреймворками и библиотеками, вам пора либо в руководители, либо на пенсию.
Здравствуйте, student__, Вы писали:
__>Здравствуйте, wl., Вы писали:
wl.>>С другой стороны, менять работу страшновато даже, у нас из 25 программистов только я на с++ пишу, похоже другие языки уверенно побеждают в прикладных направлениях
__>Если вы после C++ не в состоянии осилить другой ЯП с другими фреймворками и библиотеками, вам пора либо в руководители, либо на пенсию.
да не, по работе что прикажут, то и выучу. но эффективность будет сильно ниже. Хотя... с появлением ChatGPT может и не сильно ниже
Здравствуйте, wl., Вы писали:
wl.>да не, по работе что прикажут, то и выучу. но эффективность будет сильно ниже. Хотя... с появлением ChatGPT может и не сильно ниже
обычно специалист сам пробует инструменты, которые ему могли бы помочь в той или иной ситуации, даже если пока нет проектов, где их можно применить.
И вот, кстати говоря, "поменьше использовать С++" вполне себе желание, которое например у меня появилось, когда я более-менее изучил Питон.
Т.е. теперь я сильно подумаю, нужен ли мне C++, тем более если для Питона уже есть нужные батарейки.
__>И вот, кстати говоря, "поменьше использовать С++" вполне себе желание, которое например у меня появилось, когда я более-менее изучил Питон. __>Т.е. теперь я сильно подумаю, нужен ли мне C++, тем более если для Питона уже есть нужные батарейки.
Ну, это от задач зависит.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, so5team, Вы писали:
S>2. Выбор перегрузки на основании концептов. Т.е. прямая замена техники SFINAE.
Не прямая. У концептов рекурсия не допустима. На практике это означает,
что будешь писать код с концептами и натыкаться на ошибки соответствующего
типа, и не будешь понимать как переписать чтобы без. И тут на сцену выходит
std::enable_if. Опять. И концепт выкидывается.