Обновить
221.86

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Нескучное программирование. И снова ограничения

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели8.1K

Хотя концепты действительно являются мощным и выразительным инструментом, у них есть принципиальные ограничения, о которых важно знать, чтобы не пытаться использовать их не по назначению. Эти ограничения не случайны и не являются «недоделками» языка, а отражают осознанное архитектурное решение, принятое комитетом C++.

Первое фундаментальное ограничение это запрет прямой и косвенной рекурсии в определении концепта. Проще говоря, концепт не может ссылаться сам на себя ни напрямую, ни через цепочку других концептов. Например, такое определение является недопустимым

template<typename T>
concept Recurse = Recurse<T>;

Даже если попытаться замаскировать рекурсию через промежуточные концепты, результат будет тем же, и код все равно не скомпилируется. Это ограничение введено для того, чтобы исключить возможность бесконечных циклов на этапе проверки ограничений, но в отличие от обычных шаблонов, концепты должны проверяться быстро и предсказуемо, без риска зациклиться в процессе компиляции.

Читать далее

Новости

Заметки на полях: Изолируем Lua окружение в C++ приложении

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели5.1K

Скриптовые языки уже давно и прочно заняли свою нишу в игрострое — они существенно упрощают описание игровой логики, уровней, ресурсов, диалогов, квестов, UI и чего только не. Что позволяет отдать эти задачи целиком и полностью в творческие руки гейм-/левел-/прочих-дизайнеров и других членов команды, которым не нужно обладать знаниями в том же C++. Разделение ответственности, ускорение разработки, облегчение моддинга возможность, по завершению разработки самого движка, вышвырнуть программистов на мороз и стричь купоны на бесконечных дополнениях — в общем, одни только плюсы. Да?

Да.

А ещё дыры в безопасности и ...

... уйма путей уронить стабильность.

Передача JPEG-видео по RTP/UDP на ESP32 (RFC 2435)

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели15K

В этой статье я разберу, как реализовать передачу JPEG-видео по RTP поверх UDP напрямую с ESP32 - так, чтобы поток открывался в VLC и ffplay, без RTSP, FFmpeg и промежуточных серверов.

Читать далее

Как подружить С++ и YAML: сохранение конфигов с помощью yaml-cpp

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели5.7K

В этой статье речь пойдет о добавлении в С++ приложение функционала сохранения данных в формате YAML с использованием библиотеки yaml-cpp. Мы подробно рассмотрим какие возможности для этого предоставляет библиотека и на какие подводные камни можно наткнуться в процессе ее использования.

Особое внимание будет уделено вопросам форматирования(и представления) выходного YAML-текста, поскольку это влияет как на восприятие конечного YAML-документа человеком, так и на совместимость с другими программами, парсеры которых могут хуже поддерживать спецификации YAML.

В качестве практического примера в этой статье выбрана реализация сохранения конфигурации программы в YAML-файл, но полученные знания, конечно же, можно будет применить для формирования любого YAML-контента.

Читать далее

Как вжарить на С++ 23 или захватываем больницу и переписываем рантайм под Windows 95 и точка

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели14K

Приветствую, Хабравчане!

Предлагаю вам окунуться в чарующий мир С++ 23 на Windows 95. Напишем минимальную стандартную библиотеку. Будем использовать современные фичи в коде.

Расскажу как это все работает и для чего это нужно. Старичок SDL 1.2 ещё многое может. Будем использовать его для написания тонкого слоя для графики.

vector::_M_range_check: __n (which is 10)

Не бойтесь std::set, его легко приручить

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели11K

Не бойтесь std::set, его легко приручить.

Эта небольшая статья для тех, кто имеет некоторое представление об ассоциативных контейнерах стандартной библиотеки C++ (std::map, std::set и т.д.), но пока не использовал «множество» (std::set) в повседневной жизни. Этот контейнер позволяет наиболее изящно организовать коллекцию «самоидентифицируемых» объектов, не трубующих внешнего «ключа» для поиска. Но работа с std::set имеет свои особенности, о них и пойдет речь. Каких-то принциапиальных открытий статья не содержит, я просто решил собрать в одном месте некий минимально необходимый набор приемов для работы со множествами и, таким образом, несколько сэкономить время читателя, впервые решившего использовать «множества» в реальных проектах. Сразу оговорюсь, я сознательно снизил планку стандарта C++ до минимально необходимой, чтобы код, приведенный здесь, мог использоваться максимально широко (так что просьба не удивляться громоздким «устаревшим» конструкциям вроде enable_if).

... Отлично, std::set — это то, что нужно! Зачем мне std::map, если ключ уже находится внутри моего объекта! Такова была моя первая восторженная реакция после знакомства с «множеством» (std::set) стандартной библиотеки шаблонов C++. Это было давно... очень давно.

Читать далее

Direct 2D #7. Всё о тексте (От А до Я)

Уровень сложностиПростой
Время на прочтение74 мин
Охват и читатели7.4K

Это экспериментальный формат, главная цель объяснить как отобразить текст, но а дальше идёт полный перевод* всех интерфейсов и функций DirectWrite с примерами.

Читать далее

Я написал компилятор на C++ при помощи LLVM

Уровень сложностиСредний
Время на прочтение56 мин
Охват и читатели13K

GitHub

Onyx — язык программирования, нацеленный на базовую безопасность памяти, приятный синтаксис и опыт использования. Onyx написан на C++ с компиляцией на базе LLVM. На момент написания статьи язык поддерживает:

Читать далее

Шпаргалка по инференсу на С++

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели15K

Если ты только погружаешься в работу с инференсом на C++ и тебе интересно получить представление о том, как можно собирать и запускать популярные ML-библиотеки, то я рад поделиться базой, которую я использую в своих проектах.
Здесь ты найдёшь простые проекты, решающие основные ML-задачи, и немного теории к этому коду.
Надеюсь, что приведённый код может стать первой рабочей версией для новых фич в твоих проектах.

Читать далее

Три вечера, три круга ада и один MVP: как я создал анализатор памяти игры с помощью бесплатных чат-моделей

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели8.8K

В эпоху ИИ-хайпа многие обещают, что теперь кодить не нужно — достаточно «поговорить» с моделью. Автор решил проверить это на практике: за три вечера, используя только бесплатные версии Claude и Qwen, он создал прототип приложения для мониторинга игровых событий в реальном времени через чтение памяти процесса Royal Quest.

Путь оказался тернистым: от неактуальных логов и зашифрованного трафика — к CheatEngine, Wine на macOS, PyInstaller и проблемам с кодировкой. Чат-модели помогли быстро сгенерировать ядро приложения, реализовать экспорт в JSON/TXT и даже простой дашборд, но каждая итерация сопровождалась багами, потерей контекста и переписыванием кода с нуля.

Делюсь честным опытом: где ИИ действительно ускорил разработку, а где превратил её в бесконечный цикл «запрос → правка → провал». В финале — практические рекомендации: как структурировать проект для ИИ, сохранять контекст и избегать типичных ловушек.

Результат — рабочий MVP, открытый на GitHub, и убедительный вывод: ИИ — мощный соавтор, но пока ещё не замена внимательному разработчику.

Читать далее

Разработка библиотеки ленивых строк в паре с ИИ

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели8.6K

Еще одна библиотека строк для Python? Легко - если у вас есть ИИ-помощник.

Рассказываю, что хотел сделать (действительно, ленивые строки), что получилось, как использовал ИИ, с какими проблемами столкнулся, какие выводы для себя сделал.

Читать далее

Как не сломать VCL, делая кастомный контрол

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели10K

Вы когда-нибудь копировали код кастомного контрола из статьи, чтобы избавиться от мерцания, а потом обнаруживали, что он ломает совместимость, требует специфичных обработчиков и не работает в условной компиляции?
Я — да. И, как оказалось, проблема не в Windows API или GDI, а в фундаментальной ошибке проектирования: попытке «улучшить» стандартный интерфейс VCL, изменив сигнатуру OnPaint.

В этой статье я объясню, почему передача Canvas и Rect в обработчик — плохая идея, как правильно расширять TWinControl, и почему лучший компонент — тот, который пользователь даже не замечает.

Читать далее

Python без Python: как запускать код где угодно

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели16K

Команда Python for Devs подготовила перевод статьи о том, как можно компилировать Python в быстрые, кроссплатформенные исполняемые файлы без изменения исходного кода. Автор подробно разбирает архитектуру компилятора, объясняет, зачем «понижать» Python до C++, как типы позволяют «приручить» динамику языка и почему эмпирическая оптимизация даёт лучший результат, чем ручной тюнинг.

Читать далее

Ближайшие события

Нескучное программирование. Иерархия концептов

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели14K

В прошлых статьях я разобрал как работают перегрузки и как компилятор находит нужные функции в связанных пространствах имён, но что происходит, когда компилятор находит не одну, а сразу несколько подходящих перегрузок? Особенно актуальным этот вопрос становится при работе с шаблонами и концептами, потому что один и тот же тип может удовлетворять требованиям нескольких функций одновременно и вот здесь в игру вступает механизм выбора наиболее подходящей перегрузки. Без этого выбора вся система requires и концептов работать не будет.

Как компилятор выбирает лучшую перегрузку, если подходящих вариантов несколько? Интуитивно мы ожидаем, что более «точная» функция должна иметь приоритет над более общей и часто это ожидание мы переносим в правила для компилятора при написании шаблонов и ограничений. Общая идея здесь следующая: перегрузки можно не просто перечислять, а выстраивать в иерархию по степени специфичности, тогда одни функции будут описывать широкий класс типов, другие его подмножество, и, когда тип аргумента известен, компилятор должен выбрать ту функцию, чьи требования наиболее точно соответствуют этому типу. Эта логика заложена прямо в стандарте C++ и называется partial ordering, то есть частичный порядок, потому что не все перегрузки обязательно сравнимы между собой.

Немножко сложности...

Почему ваш бектест врёт на 50%, и при чём тут выбор между Python и C++

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.6K

Sharpe 2.1 в pandas-бектесте, через три месяца реальной торговли упал до 0.3

Pandas-бектесты систематически завышают доходность на 30-70%. Одна строчка с shift(-1) и вы уже используете завтрашние данные для сегодняшних решений. Плюс survivor bias, плюс нереалистичные fills.

В статье разбираю источники look-ahead bias, сравниваю vectorized и event-driven подходы на данных MOEX (SBER, GAZP, LKOH за 2020-2024), мои замеры latency для Tinkoff API, и рассуждения о том, когда Python уже не вывозит и пора думать про C++

Читать далее

std::move ничего никуда не двигает: подробный рассказ о категориях значений в C++

Время на прочтение35 мин
Охват и читатели17K

Проблема: когда из-за «оптимизации» код замедляется

Начнём с ситуации, в которой могут спотыкаться даже опытные разработчики. Допустим, вы написали на C++ следующий код, который выглядит совершенно нормальным:

Читать далее

Конфигуратор микроконтроллеров STM8S103/105

Время на прочтение10 мин
Охват и читатели14K

Разработана программа с целью обучения и быстрого создания программ для управления робототехническими комплексами или электропреобразовательными установками. Программа представляет собой приложение для персонального компьютера (ПК) с операционной системой (ОС) Windows 10 и выше, разрядностью 64-бит, (версия 32-бит проверялась на Windows 7), позволяющее визуально создавать конфигурацию периферийных устройств микроконтроллеров (МК) STM8S103/STM8S105, что позволяет ускорить процесс создания “прошивки” для МК и (или) уменьшить количество ошибок при разработке. Программа по созданной визуально конфигурации, путем выбора из заданных альтернатив, ввода числовых значений и контроля правильности ввода (предупреждает об ошибках), формирует файлы проекта для программирования МК на языках C (с библиотекой SPL или программирование на уровне регистров) и Assembler (язык выбирается в настройках программы). Позволяет сохранить созданную конфигурацию в файл для использования в дальнейшем. Имеется необходимая справочная информация по МК, SPL, C упрощающая создание кода. Созданные файлы проекта можно перед отправкой в IDE редактировать в сразу этой программе.

Скачать программу Конфигуратор микроконтроллеров STM8S103/105.

Читать далее

Корутины C++20

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели12K

Думаю, многие согласятся, что реализация корутин в C++20 с первого взгляда выглядит страшновато, а документация скорее более запутывает, чем вносит ясность. Многие воспринимают работу приостанавливаемых функций как некую магию со своими странными co_abracadabra()'ми и прочими promise_type'ами.
В этой статье я хочу разоблачить якобы стоящую за корутинами магию, сдёрнуть покровы и показать, что спрятано под столом у фокусника.

Читать далее

Как подружить C++ и YAML: добавляем чтение конфигов с помощью yaml-cpp

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели6K

В этой статье я расскажу о том, как добавить в С++/CMake проект возможность чтения YAML-конфигов с помощью библиотеки yaml-cpp.

Начнем с краткого обзора интерфейса yaml-cpp, а потом разработаем небольшой проект, состоящий из библиотеки с функционалом чтения конфига и приложения, использующего эту библиотеку для получения настроек из YAML-файла.

Читать далее

Строковые ресурсы для больших систем

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели8.5K

Миллион лет назад, я первый раз попытался использовать штатный механизм управления строковыми ресурсами в Visual Studio: был травмирован, зол и разочарован. С тех пор я видел много иных инструментов для той же задачи, но время как будто остановилось - не меняется ничего. И потому очень рад, что тогда давно сделал собственный инструмент и десятилетия работаю с ним. Кратко расскажу обо всем этом.

Читать далее
1
23 ...

Вклад авторов