Ответ
Да, активно внедряю в проекты. C++17 принёс много фич, которые делают код безопаснее, выразительнее и часто эффективнее.
Чаще всего применяю:
-
std::optional<T>— для явного указания на отсутствие значения, заменяет «магические числа» илиnullptr.std::optional<std::string> find_user(int id) { if (auto it = user_map.find(id); it != user_map.end()) return it->second; return std::nullopt; // Явно «не найдено» } // Использование if (auto name = find_user(42)) { std::cout << *name << 'n'; } -
Structured Bindings — для удобной декомпозиции пар, кортежей и структур.
std::map<int, std::string> m; auto [iterator, success] = m.insert({10, "ten"}); for (const auto& [key, value] : m) { /* ... */ } -
std::string_view— для передачи строковых параметров без накладных расходов на копирование или аллокацию.void log_message(std::string_view msg, std::source_location loc = std::source_location::current()) { // Принимает и string, и char*, и string_view без копирования } -
if constexpr— для условной компиляции в шаблонах, что упрощает SFINAE.template<typename T> auto serialize(const T& obj) { if constexpr (std::is_arithmetic_v<T>) { return std::to_string(obj); } else { return obj.serialize(); // Вызывается, только если метод существует } } -
std::filesystem— наконец-то переносимый и удобный API для работы с путями и файлами.
Эти возможности стали стандартными инструментами в моём C++ арсенале, они помогают писать более чистый и надёжный код.
Ответ 18+ 🔞
Да ты посмотри, какие фичи подвезли в C++17! Прям как будто из тёмного подвала в светлую комнату вышли, ёпта. Раньше приходилось выкручиваться, а теперь — красота, можно писать код, который не стыдно показать.
Вот что у меня в работе постоянно крутится, прям без этого уже жить не могу:
-
std::optional<T>— это же просто песня, ядрёна вошь! Раньше, чтобы сказать «значения нет», или-1лепил, илиnullptrкакой-нибудь. А теперь — нате вам, явныйstd::nullopt. Читаемость зашкаливает, и никаких сюрпризов.std::optional<std::string> find_user(int id) { if (auto it = user_map.find(id); it != user_map.end()) return it->second; return std::nullopt; // Чётко и ясно: нихуя не нашёл } // Используется — одно удовольствие if (auto name = find_user(42)) { std::cout << *name << 'n'; } -
Structured Bindings (или декомпозиция, как угодно) — ну это вообще магия. Раньше с этими
firstиsecondизstd::pairглаза сломать можно было. А теперь — бац, и у тебя сразу нормальные имена переменных.std::map<int, std::string> m; auto [iterator, success] = m.insert({10, "ten"}); for (const auto& [key, value] : m) { /* ... */ } // Красота же! -
std::string_view— вот за это отдельное спасибо. Раньше вечная дилемма: передаватьconst std::string&(аллокация) илиconst char*(а если у меня уже естьstd::string?). Теперь одинstring_viewна все случаи жизни, без копирования и головной боли.void log_message(std::string_view msg, std::source_location loc = std::source_location::current()) { // Кидай сюда что угодно строкоподобное — всё схавает } -
if constexpr— это для шаблонных дел просто спасение. Раньше надо было SFINAE городить, такой код, что сам через неделю не понимал, что написал. А теперь — условная компиляция прямо в теле функции, чисто и понятно.template<typename T> auto serialize(const T& obj) { if constexpr (std::is_arithmetic_v<T>) { return std::to_string(obj); } else { return obj.serialize(); // Компилятор сам поймёт, вызывать это или нет } } -
std::filesystem— наконец-то, блядь! Переносимый и вменяемый API для работы с файлами и путями. Кончилась эра велосипедов и#ifdefпод каждую платформу.
Короче, эти штуки стали как родные. Код с ними получается безопаснее, читабельнее, и иногда даже быстрее. Прям волнение ебать, как хорошо, когда язык развивается в правильную сторону.