📦 Создание модулей C++20 для быстрой компиляции
❗️ Проблема:
Медленная компиляция из-за #include файлов.
✅ Решение:
1️⃣ Создайте
2️⃣ Экспортируйте нужные декларации
3️⃣ Импортируйте модуль в коде
❌ Частые ошибки:
Забывать ключевое слово export для публичных функций.
💡 Совет:
Modules работают не во всех компиляторах — проверяйте поддержку!
Библиотека C/C++ разработчика #буст
Modules — это будущее организации C++ кода.Медленная компиляция из-за #include файлов.
module interface файл// math_utils.ixx
export module math_utils;
export namespace math {
int add(int a, int b) {
return a + b;
}
double sqrt_approx(double x) {
return x / 2.0; // Упрощенная версия
}
}
// main.cpp
import math_utils;
#include <iostream>
int main() {
std::cout << math::add(3, 4) << std::endl;
return 0;
}
Забывать ключевое слово export для публичных функций.
Modules работают не во всех компиляторах — проверяйте поддержку!
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤1
🔄 std::source_location: автоматическое логирование
Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.
Важно:
Библиотека C/C++ разработчика #буст
Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.
#include <iostream>
#include <source_location>
#include <string_view>
void log_error(std::string_view message,
const std::source_location& loc = std::source_location::current()) {
std::cout << "ОШИБКА в " << loc.file_name()
<< ":" << loc.line()
<< " в функции " << loc.function_name()
<< " - " << message << std::endl;
}
void problematic_function() {
log_error("Что-то пошло не так!"); // Автоматически получит location
}
int main() {
log_error("Ошибка инициализации");
problematic_function();
return 0;
}
Важно:
source_location вычисляется в точке вызова, не в точке определения функции.Библиотека C/C++ разработчика #буст
🔥20❤1👏1
Периодически требуется реализовать интеграцию с STL алгоритмами. Для этого необходимо реализовать правильные API.
Проблема: Нужно создать контейнер, работающий с range-based for и STL.
#include <iterator>
#include <algorithm>
#include <iostream>
template<typename T>
class CircularBuffer {
T* data;
size_t capacity_;
size_t size_;
size_t head_ = 0;
public:
explicit CircularBuffer(size_t capacity)
: data(new T[capacity]), capacity_(capacity), size_(0) {}
~CircularBuffer() { delete[] data; }
// Iterator class
class iterator {
T* ptr;
size_t capacity;
size_t index;
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;
iterator(T* ptr, size_t capacity, size_t index)
: ptr(ptr), capacity(capacity), index(index) {}
reference operator*() { return ptr[index % capacity]; }
pointer operator->() { return &ptr[index % capacity]; }
iterator& operator++() {
++index;
return *this;
}
iterator operator++(int) {
iterator tmp = *this;
++index;
return tmp;
}
bool operator==(const iterator& other) const {
return index == other.index;
}
bool operator!=(const iterator& other) const {
return !(*this == other);
}
};
void push(const T& item) {
data[(head_ + size_) % capacity_] = item;
if (size_ < capacity_) {
++size_;
} else {
++head_;
head_ %= capacity_;
}
}
iterator begin() { return iterator(data, capacity_, head_); }
iterator end() { return iterator(data, capacity_, head_ + size_); }
size_t size() const { return size_; }
bool empty() const { return size_ == 0; }
};
int main() {
CircularBuffer<int> buffer(5);
// Заполняем буфер
for (int i = 1; i <= 7; ++i) {
buffer.push(i);
}
// Range-based for работает!
for (const auto& item : buffer) {
std::cout << item << " ";
}
std::cout << std::endl;
// STL алгоритмы работают!
auto it = std::find(buffer.begin(), buffer.end(), 5);
if (it != buffer.end()) {
std::cout << "Found: " << *it << std::endl;
}
}
Частые ошибки: Не реализовать все необходимые operator для итератора.
💡 Совет: Правильные итераторы делают ваш контейнер first-class citizen в ST.
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
⚙️ Boost.Program_options
Boost.Program_options — это библиотека для элегантного парсинга аргументов командной строки и конфигурационных файлов с автоматической генерацией help и валидацией параметров.
👉 Установка:
💡 Примеры использования:
✍️ Дополнительные возможности:
— Поддержка конфигурационных файлов
— Валидация типов и значений
— Группировка опций
— Автоматическая генерация справки
🔍 Специальная фича:
Библиотека C/C++ разработчика #буст
Устали писать парсинг argc/argv вручную для каждого приложения?
Boost.Program_options — это библиотека для элегантного парсинга аргументов командной строки и конфигурационных файлов с автоматической генерацией help и валидацией параметров.
👉 Установка:
# Часть Boost libraries
sudo apt install libboost-program-options-dev
# Или через vcpkg: vcpkg install boost-program-options
💡 Примеры использования:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
("help,h", "Help message")
("input,i", po::value<string>(), "Input file")
("verbose,v", "Verbose output");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
✍️ Дополнительные возможности:
— Поддержка конфигурационных файлов
— Валидация типов и значений
— Группировка опций
— Автоматическая генерация справки
🔍 Специальная фича:
// Комбинирование источников конфигурации
po::store(po::parse_command_line(argc, argv, desc), vm);
po::store(po::parse_config_file("config.ini", desc), vm);
po::notify(vm); // Применение всех значений
Библиотека C/C++ разработчика #буст
🔥5❤3👍3❤🔥1