SFINAE (Substitution Failure Is Not An Error) — это одна из самых мощных и менее известных техник в C++, которая позволяет выбирать, какие функции должны быть скомпилированы, на основе доступности определенных типов или выражений.
•
SFINAE позволяет автоматически исключать функции из компиляции, если параметры или выражения не соответствуют определенным условиям. Это достигается с помощью специальных инструментов, таких как std::enable_if
.•
В примере выше используются std::enable_if_t
и std::is_integral_v
для выбора функции, которая будет скомпилирована, на основе типа передаваемого аргумента.•
SFINAE делает код более универсальным и позволяет использовать единую функцию для обработки различных типов данных, выбирая правильную реализацию на этапе компиляции.Please open Telegram to view this post
VIEW IN TELEGRAM
В многопоточных приложениях иногда требуется лениво инициализировать ресурсы, гарантируя, что это произойдет только один раз, даже если несколько потоков пытаются сделать это одновременно.
std::call_once
.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Параметром шаблона могут быть конкретные целые числа.•
Параметром шаблона также могут быть конкретные функции.•
Это позволяет компилятору встраивать вызовы для этих функций в коде инстанцированного шаблона для более эффективного выполнения.•
В примере ниже, функция memoize()
в качестве шаблонного параметра получает функцию и вызывает эту функцию для новых значений аргумента.•
Старое сохранённое значение аргумента берётся из кеша.Please open Telegram to view this post
VIEW IN TELEGRAM
Итераторы-адаптеры - это классы, которые оборачивают стандартные итераторы и предоставляют дополнительные возможности или изменяют их поведение.
•
Итераторы-адаптеры предоставляют дополнительные возможности для работы с итераторами, такие как итерация в обратном порядке или фильтрация элементов.•
Использование итераторов-адаптеров позволяет упростить код и делает его более читаемым за счет высокоуровневого интерфейса.•
Итераторы-адаптеры добавляют гибкость в работу с контейнерами, позволяя выполнять сложные операции и манипуляции с элементами.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.•
Это может быть полезно для сокрытия частей реализации базового класса от внешнего мира или ограничения доступа к членам в иерархии классов.•
Эта фишка особенно полезна при проектировании классов и их взаимодействия, позволяя более гибко управлять доступом к данным и методам в рамках наследования.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.Please open Telegram to view this post
VIEW IN TELEGRAM
Lambda-функции — это мощный инструмент в C++, позволяющий определять анонимные функции прямо в месте их использования.
•
Они особенно полезны для создания компактного и читаемого кода, например, при работе с алгоритмами из стандартной библиотеки (STL).Please open Telegram to view this post
VIEW IN TELEGRAM
•
Переопределение ключевых слов — плохая практика программирования, но это возможно через препроцессор. Это может вводить баги, например, #define true false
или #define else
.#define int float
#define float char
•
Такой код будет работать, хотя это может быть полезно в некоторых ситуациях. Например, если мы используем большую библиотеку и не хотим публичного наследования, мы можем временно отключить защиту доступа перед подключением заголовков библиотеки, а затем снова включить её.#define public private
#include "mylibrary.h"
#undef private
•
Это позволяет управлять доступом к библиотеке без её изменения, но требует осторожности.Please open Telegram to view this post
VIEW IN TELEGRAM
Туториал по Unreal Engine: C+
Blueprints — очень популярный способ создания геймплея в Unreal Engine 4. Однако если вы уже давно программируете и предпочитаете код, то вам идеально подойдёт C++. С помощью C++ можно даже вносить изменения в движок и создавать собственные плагины.
Смотреть статью
Blueprints — очень популярный способ создания геймплея в Unreal Engine 4. Однако если вы уже давно программируете и предпочитаете код, то вам идеально подойдёт C++. С помощью C++ можно даже вносить изменения в движок и создавать собственные плагины.
Смотреть статью
Удаление всех вхождений элемента в массив
В этом методе сдвиньте нецелевой элемент в левую сторону.
• Проверьте, является ли текущий элемент целевым элементом или нет.
• Если это целевой элемент, увеличьте переменную cnt.
• После этого элемента все нецелевые элементы сдвинутся влево с промежутком (n-cnt).
Временная сложность: O(n)
Сложность пространства: O(1)
На картинке приведена программа на C ++ для удаления всех вхождений элемента из массива с использованием оптимизированного подхода.
В этом методе сдвиньте нецелевой элемент в левую сторону.
• Проверьте, является ли текущий элемент целевым элементом или нет.
• Если это целевой элемент, увеличьте переменную cnt.
• После этого элемента все нецелевые элементы сдвинутся влево с промежутком (n-cnt).
Временная сложность: O(n)
Сложность пространства: O(1)
На картинке приведена программа на C ++ для удаления всех вхождений элемента из массива с использованием оптимизированного подхода.
Алгоритм compare
Если вызывающая строка меньше строки s, то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s, функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.
Подробнее про алгоритм можно почитать здесь.
Если вызывающая строка меньше строки s, то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s, функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.
Подробнее про алгоритм можно почитать здесь.
#вопросы_с_собеседований
Какие специальные функции-члены может генерировать сам компилятор? Напишите их сигнатуру?
Ответ:
Компилятор может сам генерировать шесть функций.
• Конструктор по умолчанию;
Object();
• деструктор;
~Object();
• копирующий конструктор;
Object(const Object& oth);
• оператор копирующего присваивания;
Object& operator=(const Object& oth);
• перемещающий конструктор;
Object(Object&& oth);
• оператор перемещающего присваивания;
Object& operator=(Object&& oth);
Какие специальные функции-члены может генерировать сам компилятор? Напишите их сигнатуру?
Ответ:
• Конструктор по умолчанию;
Object();
• деструктор;
~Object();
• копирующий конструктор;
Object(const Object& oth);
• оператор копирующего присваивания;
Object& operator=(const Object& oth);
• перемещающий конструктор;
Object(Object&& oth);
• оператор перемещающего присваивания;
Object& operator=(Object&& oth);
Видеоуроки по созданию игры на C++
Серия видео, в которой автор по шагам рассказывает, как написать свою игру на C++.
Смотреть статью
Серия видео, в которой автор по шагам рассказывает, как написать свою игру на C++.
Смотреть статью
#вопросы_с_собеседований
Что выведет код сверху?
Ответ:
10 99 40 99
В этой программе мы меняем местами определенные значения в двух векторах с помощью iter_swap.
Что выведет код сверху?
Ответ:
В этой программе мы меняем местами определенные значения в двух векторах с помощью iter_swap.
Функция div()
Функция
Функции
#для_начинающих
Функция
div()
вычисляет величину numerator/denominator
и возвращает частное и остаток в структуре div_t
, которая содержит два целочисленных поля (в неопределённом порядке) quot
и rem
. Частное округляется до ближайшего нуля. Результат равняется quot*denominator+rem = numerator
.Функции
ldiv()
, lldiv()
и imaxdiv()
выполняют эту же функцию, деля числа соответствующего типа и возвращая результат в структуре с соответствующим именем, всегда с полями quot
и rem
того же типа, что и аргументы функции.#для_начинающих
Функция ptsname()
Функция
Функция
#для_начинающих
Функция
ptsname()
возвращает имя подчиненного псевдотерминального устройства, соответствующего главному устройству, на которое ссылается файловый дескриптор fd
.Функция
ptsname_r()
является реентерабельным эквивалентном ptsname()
. Она сохраняет имя устройства подчинённого псевдо-терминала в виде строки (завершающейся null) в буфер, указанный в buf
. В аргументе buflen
задаётся количество байт, доступных в buf
.#для_начинающих
Библиотека <pty.h>
Библиотека
#для_начинающих
Библиотека
<pty.h>
используется для работы с псевдотерминалами (PTY — Pseudo Terminal). Псевдотерминалы предоставляют средство для создания пары устройств, одно из которых может использоваться как мастер (master), а другое как рабочее (slave). Процессы могут обмениваться данными между этими устройствами, эмулируя терминальные взаимодействия.#для_начинающих