std::variant (C++17) — это union, который знает свой текущий тип и гарантирует безопасность.// C-style union — опасно!
union Data {
int i;
double d;
char* str;
};
Data data;
data.i = 42;
std::cout << data.d; // ❌ Читаем не то, что записали
std::variant<int, double, std::string> data;
data = 42; // Хранит int
data = 3.14; // Теперь хранит double
data = "hello"; // Теперь хранит string
// Безопасное получение значения
if (auto* val = std::get_if<int>(&data)) {
std::cout << "int: " << *val << '\n';
}
std::variant<int, std::string, double> v;
// Установка значения
v = 100;
v = "text";
v.emplace<std::string>("constructed in place");
// Проверка текущего типа
std::cout << v.index(); // Индекс типа: 0, 1, или 2
if (std::holds_alternative<int>(v)) {
std::cout << "Содержит int\n";
}
// Получение значения
try {
auto val = std::get<int>(v); // Бросит std::bad_variant_access
} catch (const std::bad_variant_access&) {
std::cerr << "Неверный тип!\n";
}
auto* ptr = std::get_if<std::string>(&v); // nullptr если не string
std::variant<int, double, std::string> v = 42;
// Обработка всех возможных типов
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>) {
std::cout << "int: " << arg << '\n';
} else if constexpr (std::is_same_v<T, double>) {
std::cout << "double: " << arg << '\n';
} else {
std::cout << "string: " << arg << '\n';
}
}, v);
cpptemplate<class... Ts>
struct overloaded : Ts... {
using Ts::operator()...;
};
template<class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;
// Элегантная обработка!
std::visit(overloaded{
[](int i) { std::cout << "int: " << i << '\n'; },
[](double d) { std::cout << "double: " << d << '\n'; },
[](const std::string& s) { std::cout << "string: " << s << '\n'; }
}, v);
template<typename T>
using Result = std::variant<T, std::string>; // Value или Error
Result<int> divide(int a, int b) {
if (b == 0) return "Division by zero";
return a / b;
}
auto result = divide(10, 0);
std::visit(overloaded{
[](int value) { std::cout << "Result: " << value << '\n'; },
[](const std::string& err) { std::cerr << "Error: " << err << '\n'; }
}, result);
std::variant никогда не пустой (кроме исключительных ситуаций). Первый тип должен быть конструируемым по умолчанию.Используйте
std::variant когда набор типов известен. std::any — для действительно произвольных типов.Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤2
🔍 Промпт: Регулярные выражения в C++
Работаете с регулярками в C++ и запутались в std::regex? Есть простой лайфхак!
✏️ Используйте промпт
❗️ Пример использования
Запрос:
Получаем:
🔥 Что можно запрашивать
✅ Валидация email, телефонов, URL
✅ Извлечение данных из строк
✅ Поиск паттернов в логах
✅ Парсинг форматов файлов
✅ Проверка форматов дат/времени
Библиотека C/C++ разработчика
#буст
Работаете с регулярками в C++ и запутались в std::regex? Есть простой лайфхак!
Write a regular expression that matches / Write a RegEx pattern for:
[ваше описание]
Запрос:
Email addresses with validationПолучаем:
std::regex email_pattern(
R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"
);
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3
Горячие клавиши — добро, польза и экономия времени. Давайте разберёмся, как с их помощью упростить себе жизнь в Visual Studio Code.
Windows — Ctrl + Shift + \
macOS — Shift + Command + \
Когда кода становится много, очень просто запутаться в закрывающих и открывающих скобках, непонятно, где какой блок, и вообще, что происходит. На помощь приходит Ctrl + Shift + \ — это хорошее дополнение к стандартной подсветке парных скобок в VS Code.
Windows — F2
macOS — F2
Писали, писали, а старший разработчик пришёл и сказал, что ваши переменные a, b и c — дурной тон. Чтобы не выискивать их по всему документу и не менять руками, есть F2.
Windows — Shift + Alt + F
macOS — Shift + Option + F
VS Code предложит установить расширение или выбрать из существующих, а потом красиво отформатирует документ — расставит по местам блоки и скобки, сделает строки кода читаемыми.
Windows — F12
macOS — F12
Иногда вообще непонятно, откуда взялась переменная, какая у неё область видимости и где она объявлена. F12 перенесёт вас к объявлению выделенной переменной, функции или метода. Если объявление в другом файле — всё равно перенесёт.
Windows — Alt + Z
macOS — Option + Z
Если строки кода или текст не вмещаются в редактор по ширине, включите перенос.
Windows — Ctrl + KZ
macOS — Command + KZ
Лучшее решение для тех, кто входит в состояние потока, когда пишет код. Дзен-режим скрывает все панели, разворачивает редактор на весь экран, и вы можете плыть в волнах кода и думать только о нём. Чтобы вернуться в реальный мир, нажмите Escape.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🥰1
⚙️ Почему классический ООП тормозит игровые движки — и что с этим делать
Обработка тысяч объектов в реальном времени превращается в кошмар с традиционным C++. Программист из Блэкхаб Геймс показывает, как
🧨 Что узнаешь из доклада:
• Почему наследование и виртуальные таблицы убивают производительность при обработке тысяч сущностей
• Как ECS разделяет данные и логику
• Data-Oriented Design: как пулы компонентов улучшают кэш-локальность и позволяют использовать SIMD
• Простая многопоточность без головной боли
• Практическая реализация на библиотеке Flex с примерами кода
• Почему доступ через ID лучше указателей в динамичных игровых сценах
Доклад полезен не только геймдевам — ECS применяется в биржевых системах, симуляциях и везде, где нужна высокая производительность обработки данных.
👉 Видео
Библиотека C/C++ разработчика
#буст
Обработка тысяч объектов в реальном времени превращается в кошмар с традиционным C++. Программист из Блэкхаб Геймс показывает, как
Entity Component System решает проблемы производительности.🧨 Что узнаешь из доклада:
• Почему наследование и виртуальные таблицы убивают производительность при обработке тысяч сущностей
• Как ECS разделяет данные и логику
• Data-Oriented Design: как пулы компонентов улучшают кэш-локальность и позволяют использовать SIMD
• Простая многопоточность без головной боли
• Практическая реализация на библиотеке Flex с примерами кода
• Почему доступ через ID лучше указателей в динамичных игровых сценах
Доклад полезен не только геймдевам — ECS применяется в биржевых системах, симуляциях и везде, где нужна высокая производительность обработки данных.
👉 Видео
Библиотека C/C++ разработчика
#буст
❤4👍1👏1