Концепты - это новая возможность в C++20, которая позволяет задавать ограничения на шаблонные параметры. Это позволяет писать более безопасный и читаемый код, поскольку компилятор проверяет соответствие типов требованиям концептов на этапе компиляции.
• template<typename T> concept Arithmetic = std::is_arithmetic_v<T>;
определяет концепт Arithmetic, который ограничивает типы, для которых значение std::is_arithmetic_v<T>
истинно (т.е. типы, которые являются арифметическими).• template<Arithmetic T> T add(const T& a, const T& b)
определяет шаблонную функцию add, которая будет компилироваться только для типов, удовлетворяющих концепту Arithmetic.Использование функции add:
•
Примеры с целыми числами и числами с плавающей запятой успешно вызывают функцию add
.
•
Пример со строками (закомментированный) вызовет ошибку компиляции, так как std::string
не является арифметическим типом.Please open Telegram to view this post
VIEW IN TELEGRAM
Модули - это система сборки и организации кода, представленная в C++20.
•
Они улучшают компиляцию и организацию кода, предоставляя более четкий и эффективный способ управления зависимостями.
•
Модули заменяют использование препроцессорных директив #include, улучшая время компиляции и предотвращая проблемы с зависимостями и макросами.
•
Модули значительно сокращают время компиляции по сравнению с традиционными заголовочными файлами, так как они компилируются только один раз.
•
Модули предотвращают проблемы, связанные с макросами и конфликтами имен, поскольку они предоставляют четкие границы и изолированные области видимости.
•
Модули упрощают управление зависимостями и организацию кода, что делает проекты более поддерживаемыми и масштабируемыми.Please open Telegram to view this post
VIEW IN TELEGRAM
•
auto-типизированные переменные выводятся компилятором на основе типа их инициализатора.•
Чрезвычайно полезно с точки зрения удобочитаемости, особенно для сложных типов:// std::vector<int>::const_iterator cit = v.cbegin();
auto cit = v.cbegin(); // альтернатива
// std::shared_ptr<vector<uint32_t>> demo_ptr(new vector<uint32_t>(0);
auto demo_ptr = make_shared<vector<uint32_t>>(0); // альтернатива
•
Функции также могут выводить тип возвращаемого значения с помощью auto
. В C++11 тип возвращаемого значения должен быть указан либо явно, либо с помощью decltype
, например:template <typename X, typename Y>
auto add(X x, Y y) -> decltype(x + y)
{
return x + y;
}
add(1, 2); // == 3
add(1, 2.0); // == 3.0
add(1.5, 1.5); // == 3.0
•
Приведенная выше форма определения возвращаемого типа называется trailing return type, т.е. -> return-type
.Please open Telegram to view this post
VIEW IN TELEGRAM
Snake – искусственный интеллект для игры «Змейка»
Цель змеи – постоянно есть пищу и как можно скорее заполнить карту своим телом
Первоначально проект был написан на C++. Теперь он был переписан на Python с удобным графическим интерфейсом для пользователя
https://github.com/chuyangliu/snake
Цель змеи – постоянно есть пищу и как можно скорее заполнить карту своим телом
Первоначально проект был написан на C++. Теперь он был переписан на Python с удобным графическим интерфейсом для пользователя
https://github.com/chuyangliu/snake
GitHub
GitHub - chuyangliu/snake: Artificial intelligence for the Snake game.
Artificial intelligence for the Snake game. Contribute to chuyangliu/snake development by creating an account on GitHub.
#вопросы_с_собоседований
В чем различия между delete и delete[]?
delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().
При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.
В чем различия между delete и delete[]?
delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().
При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.
#вопросы_с_собеседований
В чем проблема следующего фрагмента?
Из спецификации (C++11 §5.3.5/3):
Если статический тип подлежащего удалению объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа подлежащего удалению объекта и иметь виртуальный деструктор или поведение undefined.
В чем проблема следующего фрагмента?
Из спецификации (C++11 §5.3.5/3):
Если статический тип подлежащего удалению объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа подлежащего удалению объекта и иметь виртуальный деструктор или поведение undefined.
Что нужно дописать, чтобы при вызове конструктора перемещения член класса действительно "переместился"?
Нужно дописать std::move в списке инициализации перемещающего конструктора:
Нужно дописать std::move в списке инициализации перемещающего конструктора:
A(A&& oth) : str(std::move(oth.str)){ }
Но это гарантирует "перемещение" только в том случае, если у этого объекта, в свою очередь, есть перемещающий конструктор (в данном случае, у std::string он есть).Алгоритм prev_permutation
Алгоритм переставляет элементы так, чтобы получилась предыдущая в лексикографическом порядке перестановка. Можно применять не только к векторам, но и к строкам (как и многие другие алгоритмы).
Метод возвращает true, если удалось построить предыдущую в лексикографическом порядке перестановку. Если же первоначальная перестановка уже была минимальной в лексикографическом порядке, то метод генерирует максимальную в лексикографическом порядке перестановку и возвращает false.
Алгоритм переставляет элементы так, чтобы получилась предыдущая в лексикографическом порядке перестановка. Можно применять не только к векторам, но и к строкам (как и многие другие алгоритмы).
Метод возвращает true, если удалось построить предыдущую в лексикографическом порядке перестановку. Если же первоначальная перестановка уже была минимальной в лексикографическом порядке, то метод генерирует максимальную в лексикографическом порядке перестановку и возвращает false.
FFmpeg libav с нуля. Часть 1: знакомство и начало работы
FFmpeg - это набор библиотек и утилит командной строки, которые используются повсеместно для обработки мультимедийных материалов.
Смотреть статью
FFmpeg - это набор библиотек и утилит командной строки, которые используются повсеместно для обработки мультимедийных материалов.
Смотреть статью
Основные концепции библиотеки chrono (C++)
Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения.
Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах.
Смотреть статью
Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения.
Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах.
Смотреть статью
Опыт создания клипа на Unreal Engine 5.1 с метахьюманом, ветром и багами
https://habr.com/ru/post/714424/
https://habr.com/ru/post/714424/
Хабр
Опыт создания клипа на Unreal Engine 5.1 с метахьюманом, ветром и багами
Руины родного дома Вступление По роду деятельности, я не музыкант, не занимаюсь синематикой, а в движке (причём другом), я большей частью нахожу и исправляю баги. Но так уж вышло, что родился и вырос...
Монадическая композиция Expected в C++
Здесь речь пойдёт о трюке, который ещё больше имитирует код под исключения C++.
Смотреть статью
Здесь речь пойдёт о трюке, который ещё больше имитирует код под исключения C++.
Смотреть статью
Функция map::at()
Map - это контейнер в STL, который используется для хранения элементов в виде пары ключ-значение. Внутренне элементы map всегда сортируются по ее ключу. Карты в основном реализованы в виде бинарных деревьев поиска.
Функция
Map - это контейнер в STL, который используется для хранения элементов в виде пары ключ-значение. Внутренне элементы map всегда сортируются по ее ключу. Карты в основном реализованы в виде бинарных деревьев поиска.
Функция
map::at()
используется для возврата ссылки на элемент, связанный с ключом k.Могут ли ссылки отсылать к недопустимому местоположению в памяти в C++?
В C++ ссылки более безопасны, чем указатели, потому что ссылки должны быть инициализированы, и их нельзя изменить, чтобы ссылаться на что-то другое после инициализации. Но есть исключения, когда у нас могут быть недействительные ссылки.
Но есть пара исключений, когда у нас могут быть недействительные ссылки. Они приведены на картинке.
В C++ ссылки более безопасны, чем указатели, потому что ссылки должны быть инициализированы, и их нельзя изменить, чтобы ссылаться на что-то другое после инициализации. Но есть исключения, когда у нас могут быть недействительные ссылки.
Но есть пара исключений, когда у нас могут быть недействительные ссылки. Они приведены на картинке.