🔄 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++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Периодически требуется реализовать интеграцию с 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📰 Свеженькое из мира C++
Недельный дайджест новостей о разных аспектах программирования и интересных проектах в мире C++.
🥳 Интересное:
• Qt Quick/QML — декларативный UI для C++ приложений
• Отладка сопрограмм C++ — доклад о практических аспектах отладки сопрограмм
😎 Полезное:
• Исключения в C++ — набор карточек на базовые темы касающиеся исключений
• Поиск и исправление ошибок в C++ — промпт с помощью которого можно быстро находить ошибки в коде
• std::source_location — полезная фишка C++ с помощью которой можно облегчить легирование
• Создание собственного итератора для контейнера
• Сборка фреймворка QT из исходников
🖨️Интересные проекты:
• LEGO Island — портативная версия LEGO Island основанная на декомпилированном проекте
• Hyprland — независимый тайловый компоновщик
• Dragonfly — in-memory хранилище данных
Библиотека C/C++ разработчика #свежак
Недельный дайджест новостей о разных аспектах программирования и интересных проектах в мире C++.
🥳 Интересное:
• Qt Quick/QML — декларативный UI для C++ приложений
• Отладка сопрограмм C++ — доклад о практических аспектах отладки сопрограмм
😎 Полезное:
• Исключения в C++ — набор карточек на базовые темы касающиеся исключений
• Поиск и исправление ошибок в C++ — промпт с помощью которого можно быстро находить ошибки в коде
• std::source_location — полезная фишка C++ с помощью которой можно облегчить легирование
• Создание собственного итератора для контейнера
• Сборка фреймворка QT из исходников
🖨️Интересные проекты:
• LEGO Island — портативная версия LEGO Island основанная на декомпилированном проекте
• Hyprland — независимый тайловый компоновщик
• Dragonfly — in-memory хранилище данных
Библиотека C/C++ разработчика #свежак
Forwarded from Библиотека задач по C++ | тесты, код, задания
Forwarded from Библиотека задач по C++ | тесты, код, задания
Что выведет программа в C++20?
Anonymous Quiz
44%
1212
26%
Ошибка компиляции для d1
3%
0012
6%
1200
22%
Ошибка компиляции для обеих
🏖 Подборка вакансий для C++-разработчиков за неделю
Senior С++ / Rust Developer — от 300 000 и до 450 000 ₽ Гибрид (Москва, Санкт-Петербург)
Разработчик C++ — от 350 000 и до 500 000 ₽ Гибрид (Москва)
C/C++ Developer — от 350 000 и до 500 000 ₽ Гибрид (Москва)
Разработчик на C++ — от 250 000 и до 350 000 ₽ Офис (Москва)
➡️ Еще больше топовых вакансий — в нашем канале C++ jobs
Библиотека C/C++ разработчика
Senior С++ / Rust Developer — от 300 000 и до 450 000 ₽ Гибрид (Москва, Санкт-Петербург)
Разработчик C++ — от 350 000 и до 500 000 ₽ Гибрид (Москва)
C/C++ Developer — от 350 000 и до 500 000 ₽ Гибрид (Москва)
Разработчик на C++ — от 250 000 и до 350 000 ₽ Офис (Москва)
➡️ Еще больше топовых вакансий — в нашем канале C++ jobs
Библиотека C/C++ разработчика