Библиотека C/C++ разработчика | cpp, boost, qt
19.9K subscribers
1.88K photos
55 videos
16 files
4.09K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🔧 Как правильно передать данные в std::thread

Передача параметров в потоки — источник багов даже у опытных разработчиков. Главная проблема: время жизни объектов и способы передачи.

Пошаговое решение:

1️⃣ Используйте std::ref для ссылок
2️⃣ Копируйте простые типы по значению
3️⃣ Перемещайте тяжелые объекты через std::move
4️⃣ Избегайте сырых указателей

#include <thread>
#include <string>

void process_data(int value, const std::string& text, std::vector<int>& result) {
// Обработка данных
result.push_back(value);
}

int main() {
int number = 42;
std::string message = "Hello";
std::vector<int> results;

// Правильная передача параметров
std::thread t(process_data, number,
std::cref(message), // const ссылка
std::ref(results)); // обычная ссылка

t.join();
return 0;
}



⚠️ Частые ошибки:

• Передача ссылок без std::ref
• Доступ к локальным переменным после их уничтожения


💡 При сомнениях используйте передачу по значению🤓

Библиотека C/C++ разработчика #буст
🥰42🥱1
🍩 C++ Concepts — типобезопасность на новом уровне


‼️ Проблема:

В шаблонах C++ ошибки типов приводят к критическим сообщениям компилятора на десятки строк. Отладка становится кошмаром, особенно для новичков в команде.


Решение:

C++ Concepts
позволяют явно указать требования к типам шаблонов. Это делает код самодокументируемым и дает понятные сообщения об ошибках.


✏️ Пример кода:
#include <concepts>

// Определяем концепт для числовых типов
template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;

// Функция принимает только числовые типы
template<Numeric T>
T multiply(T a, T b) {
return a * b;
}

int main() {
auto result1 = multiply(5, 10); // OK: int
auto result2 = multiply(3.14, 2.0); // OK: double
// auto result3 = multiply("hello", "world"); // Ошибка компиляции с понятным сообщением
return 0;
}



🌳 Преимущества:

• Понятные сообщения об ошибках компиляции
• Самодокументируемый код с явными требованиями к типам
• Улучшенная производительность компиляции за счет раннего отсева неподходящих типов
• Возможность перегрузки функций на основе концептов

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🥰51
📦 Создание модулей C++20 для быстрой компиляции

Modules — это будущее организации C++ кода.


❗️ Проблема:

Медленная компиляция из-за #include файлов.


Решение:

1️⃣ Создайте module interface файл
2️⃣ Экспортируйте нужные декларации
3️⃣ Импортируйте модуль в коде

// 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
🔥141
🔄 std::source_location: автоматическое логирование

Забудьте 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++ разработчика #буст
🔥201👏1