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

«Используешь ли нововведения из C++17?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно внедряю в проекты. 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++ арсенале, они помогают писать более чистый и надёжный код.