Последние стандарты C++ принесли множество значимых улучшений. Вот ключевые фичи, которые изменили мой подход к разработке:
Что дает: Упрощает работу с кортежами и структурами
std::map<int, std::string> m = {{1, "one"}, {2, "two"}};
for (const auto& [key, value] : m) { // Автоматическая декомпозиция
std::cout << key << ": " << value << '\n';
}
Зачем: Явное представление опциональных значений вместо nullptr
или "волшебных чисел"
std::optional<int> findItem(const std::vector<int>& v, int target) {
auto it = std::find(v.begin(), v.end(), target);
if (it != v.end()) return *it;
return std::nullopt;
}
Польза: Типобезопасный union + pattern matching
std::variant<int, float, std::string> v;
v = 3.14f;
std::visit([](auto&& arg) { // Обработка всех типов
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>) {
std::cout << "int: " << arg;
} else if constexpr (std::is_same_v<T, float>) {
std::cout << "float: " << arg;
}
}, v);
Производительность: Запуск алгоритмов на нескольких ядрах
std::vector<int> v = {...};
std::sort(std::execution::par, v.begin(), v.end()); // Параллельная сортировка
Преимущества: Ограничения шаблонов с понятными ошибками компиляции
template <typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
template <Numeric T> // Явное ограничение
T square(T x) { return x * x; }
Удобство: Композиция алгоритмов без итераторов
#include <ranges>
namespace views = std::views;
auto even = [](int i) { return i % 2 == 0; };
auto square = [](int i) { return i * i; };
for (int i : std::views::iota(1)
| views::filter(even)
| views::transform(square)
| views::take(10)) {
std::cout << i << ' '; // 4 16 36 64 100 144 196 256 324 400
}
Применение: Асинхронный код без callback hell
#include <coroutine>
generator<int> range(int start, int end) {
for (int i = start; i < end; ++i)
co_yield i; // Приостановка и возобновление
}
for (int i : range(1, 10)) {
std::cout << i << ' '; // 1 2 3 ... 9
}
Улучшение: Современная замена printf
и строковых потоков
std::cout << std::format("Hello, {}! The answer is {:.2f}\n", "world", 3.14159);
// Hello, world! The answer is 3.14
Синтаксис: Упрощение операторов сравнения
struct Point {
int x, y;
auto operator<=>(const Point&) const = default; // Генерация всех сравнений
};
Фича | C++17 | C++20 |
---|---|---|
Concepts | ❌ | ✅ |
Ranges | ❌ | ✅ |
Structured Bindings | ✅ | ➕ |
Coroutines | ❌ | ✅ |
Параллельные алгоритмы | ✅ | ➕ |
➕ - улучшено в C++20
C++17 сделал код:
optional
, variant
)C++20 принес:
Эти стандарты изменили идиоматику C++, приблизив язык к современным парадигмам разработки без потери производительности.