С++ задачи и вопросы
571 subscribers
515 photos
4 files
199 links
Задачи, тесты и теоретические вопросы по С++

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Вопрос на собеседовании

Как функционирует expression SFINAE в C++, и чем оно отличается от обычного SFINAE?

Ответ ⬇️
SFINAE (Substitution Failure Is Not An Error) позволяет компилятору игнорировать неподходящие шаблонные перегрузки, не выдавая ошибок. Expression SFINAE — это метод, при котором проверяется не только наличие типа, но и возможность использования выражения с этим типом.

Обычный SFINAE работает с typename, тогда как expression SFINAE применяется в decltype() для проверки существования определенных операций или методов в типе.

Пример использования ⚙️
#include
#include

// Проверяем, есть ли у типа метод size()
template
auto has_size(int) -> decltype(std::declval().size(), std::true_type{}) {
return {};
}

template
std::false_type has_size(...) { return {}; }

int main() {
std::cout
@quizcpp
⚙️ std::from_chars

std::from_chars (C++17) предоставляет возможность быстро преобразовать строку в число без ненужных аллокаций и проверок на исключения, что делает его более быстрым, чем std::stoi.

👩‍💻
@quizcpp
⚙️ std::bind_front

std::bind_front (C++20) позволяет предварительно привязывать первые аргументы функции или функторов, что упрощает их последующие вызовы.

👩‍💻
@quizcpp
⚙️ std::countr_zero

std::countr_zero (C++20) подсчитывает, сколько нулевых битов находится в конце двоичного представления числа. Это полезно для выполнения битовых операций и оптимизаций.

👩‍💻
@quizcpp
⚙️ std::byteswap (C++23) изменяет порядок байтов в числе, что удобно для работы с системами big-endian и little-endian. 👩‍💻
@quizcpp
👍1
⚙️ std::endian

std::endian (C++20) указывает на порядок байтов (big-endian или little-endian) в текущей системе. Это важно при взаимодействии с бинарными файлами и сетевыми протоколами.

👩‍💻
@quizcpp
👍1
⚙️ std::scope_guard

std::scope_guard (C++23) автоматически осуществляет заданное действие при выходе из области видимости, что способствует управлению ресурсами и предотвращает утечки.

👩‍💻
@quizcpp
🔥2
⚙️ std::atomic_flag

std::atomic_flag — это базовый атомарный флаг, предназначенный для низкоуровневой синхронизации потоков без использования блокировок. Он полезен для создания спинлоков.

👩‍💻
@quizcpp
⚙️ std::hive

std::hive (C++23) — это контейнер, который оптимизирован для частых добавлений и удалений элементов, при этом предотвращая фрагментацию памяти. В отличие от std::vector или std::list, hive предлагает эффективное управление памятью и итерацию.

👩‍💻
@quizcpp
👍3
⚙️ fmt::print()

fmt::print() из библиотеки {fmt} — это современный способ форматирования и вывода текста, который является альтернативой printf() и std::cout. Он предлагает удобные возможности для форматирования, безопасный подход и высокую производительность.

🔗 Документация (https://fmt.dev/)

👩‍💻
@quizcpp
🚫 Антипаттерн недели: Использование ручного управления памятью вместо std::unique_ptr

В C++ применение new и delete без должного контроля может вызвать утечки памяти, ошибки двойного освобождения и неопределённое поведение.

✔️ Используйте std::unique_ptr для автоматического освобождения памяти.

👩‍💻
@quizcpp
⚙️ std::ranges::views::filter

std::ranges::views::filter (C++20) предоставляет удобный способ фильтрации элементов в диапазоне без необходимости создавать временные контейнеры. Это улучшает читаемость и производительность кода.

🔗 Документация (https://en.cppreference.com/w/cpp/ranges/filter_view)

👩‍💻
@quizcpp
⚙️ std::unordered_map::merge()

Функция std::unordered_map::merge() дает возможность соединить два unordered_map, перемещая элементы из одного контейнера в другой без создания дубликатов и копирования. Это удобно для объединения данных без необходимости явного копирования ключей и значений.

🔗 Документация (https://en.cppreference.com/w/cpp/container/unordered_map/merge)

👩‍💻
@quizcpp