Используешь ли нововведения из C++17?

Ответ

Да, активно внедряю в проекты. C++17 принёс много фич, которые делают код безопаснее, выразительнее и часто эффективнее.

Чаще всего применяю:

  1. 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';
    }
  2. Structured Bindings — для удобной декомпозиции пар, кортежей и структур.

    std::map<int, std::string> m;
    auto [iterator, success] = m.insert({10, "ten"});
    for (const auto& [key, value] : m) { /* ... */ }
  3. std::string_view — для передачи строковых параметров без накладных расходов на копирование или аллокацию.

    void log_message(std::string_view msg, std::source_location loc = std::source_location::current()) {
        // Принимает и string, и char*, и string_view без копирования
    }
  4. 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(); // Вызывается, только если метод существует
        }
    }
  5. std::filesystem — наконец-то переносимый и удобный API для работы с путями и файлами.

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

Ответ 18+ 🔞

Да ты посмотри, какие фичи подвезли в C++17! Прям как будто из тёмного подвала в светлую комнату вышли, ёпта. Раньше приходилось выкручиваться, а теперь — красота, можно писать код, который не стыдно показать.

Вот что у меня в работе постоянно крутится, прям без этого уже жить не могу:

  1. 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';
    }
  2. 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) { /* ... */ } // Красота же!
  3. 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()) {
        // Кидай сюда что угодно строкоподобное — всё схавает
    }
  4. 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(); // Компилятор сам поймёт, вызывать это или нет
        }
    }
  5. std::filesystem — наконец-то, блядь! Переносимый и вменяемый API для работы с файлами и путями. Кончилась эра велосипедов и #ifdef под каждую платформу.

Короче, эти штуки стали как родные. Код с ними получается безопаснее, читабельнее, и иногда даже быстрее. Прям волнение ебать, как хорошо, когда язык развивается в правильную сторону.