Базовая работа с GDAL: гипсобатиметрическая модель Земли

Подготовим простенькую C++ модель, возвращающую глубину Мирового океана или высоту над уровнем моря для заданных географических координат (широта, долгота), а также строгую принадлежность данной точки суше либо океану.
ЧТАТ ПОЛН →

Реализация паттерна проектирования Observer на С++17

Идея Паттерн проектирования Observer (наблюдатель) является классическим и элегантным маханизмом динамического оповещения одних объектов об обновлениях состояния других объектов. В нём один или несколько объектов-наблюдателей неким образом подключается к объекту-наблюдаемому, будто-бы подписываясь на его обновления. Наблюдаемое же ничего не знает о своих подписчиках и вызывает их общий метод, когда посчитает нужным, обычно передавая в качестве параметра указатель на самого себя (т.е. на объект-наблюдатель). Таким образом подключенные конкретные наблюдатели асинхронно получают управление и манипулируют конкретным наблюдаемым, полученным во входном параметре.
ЧТАТ ПОЛН →

Трансформация части контейнера с std::transform()

std::transform() Стандартная библиотека C++ STL содержит множество обобщённых и интересных инструментов для работы с контейнерами, что не удивительно, ведь одна из главных причин появления STL – это желание элегантно абстрагировать алгоритмы и отделить их от данных, т.е. от этих самых контейнеров. Один из простых и довольно интуитивных (для функциональных программистов) алгоритмов – трансформация последовательной области контейнера. В двух словах состит он в следующем: применяем функцию (оператор) к одному элементу контейнера, пишем куда-нибудь результат (новое значение элемента), затем передвигаем итераторы обоих контейнеров вперёд и повторяем весь процесс снова.
ЧТАТ ПОЛН →

Сигналы и слоты: асинхронные, тип-безопасные коллбэки с libsigc++

Введение Концепция сигналов/слотов (Signals/Slots), т.е. асинхронных коллбэков (callback) широко применяется в различных программных архитектурах: от системного уровня до высокоуровневых многокомпонентных библиотек вроде GUI (например, QT) или игровых движков. В общем виде идея заключается в следующем: Объекты A и B работают параллельно. Объект A регистрирует свой некоторый метод или анонимную функцию (callback-код) у объекта B. В момент регистрации объект A может передать также данные, которые должны быть доступны callback-коду. Объекты продолжают работу параллельно (без специальной взаимосвязи либо синхронизации).
ЧТАТ ПОЛН →

C++: горизонтальный полиморфизм с dynamic_cast

Введение Предположим, что мы разрабатываем приложение для военной симуляции, в котором имеется поддержка разнообразных по своим возможностям и характеристикам боевых платформ. В дизайне нашей системы мы решили отказаться от громоздкой иерархии наследования в пользу набора независимых друг от друга чистых виртуальных классов (интерфейсов), подмножество которых реализуется конкрециями через множественное наследование C++ (которое очень даже безопасно и применимо в случаях с несвязанными интерфейсами). C++ предоставляет оператор dynamic_cast<T>() для безопасного перехода (т.е. преобразования указателя) между интерфейсами, имплементированными данной конкрецией.
ЧТАТ ПОЛН →

Простая сериализация/десериализация полиморфических данных в C++

Введение Предположим, что мы, как это часто бывает, имеем вектор интерфейсов к конкретным объектам: WidgetClassA w1; WidgetClassB w2; std::vector<WidgetInterface*> wifv {&w1, &w2, ...}; /* * Прямое манипулирование конкрециями */ w1.setWidgetAParam("Test"); w2.setWidgetBSize( w1.getWidgetASize() ); // ... /* * Манипулирование разными виджетами через абстрактный интерфейс виджетов */ for (WidgetInterface* wif : wifv) { wif->widgetDoSomething(); size_t i = wif->getSize(); // ... } Мы хотим (де)сериализовать все объекты, на которые указывают интерфейсы (чистые виртуальные классы) в векторе wifv, т.
ЧТАТ ПОЛН →

Простая и комфортная разработка на C++ в vim

Вкратце В данной заметке я приведу свой текущий ~/.vimrc, настраивающий как общее поведение самого редактора vim/gvim (для редактирования любого текста), так и дополнительный функционал для разработки программ на C/C++. Сам по себе vim “из коробки” отлично подходит для редактирования кода, однако несколькими дополнительными модулями из данного текстового редактора можно сделать мощнейшую среду разработки (IDE) промышленного класса. Менеджер модулей vim-plug автоматически скачивает и обновляет плагины, поэтому для воспроизведения всей моей IDE фактически потребуется лишь один файл ~/.
ЧТАТ ПОЛН →