fa
Feedback
C++ Moscow

C++ Moscow

رفتن به کانال در Telegram

Информационный канал московского сообщества программистов на C++ Чат: @cppmoscow_chat Бот обратной связи: @cppmoscow_bot Организатор: @eoanermine

نمایش بیشتر
302
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
#proposals #resources Возвращаясь к интересным новостям: недавно комитет по стандартизации C++ опубликовал предложенные за последний месяц пропозалы. Из наиболее примечательного: 1. Продолжение работы над std::hive: был обновлен раздел, касающийся constexpr; внесено множество изменений в описание асимптотической сложности операций. 2. С учётом всех замечаний LEWG был обновлен P0876 fiber_context - fibers without scheduler, прокладывающий более широкий путь в наше светлое корутинное будущее: в частности, предлагающий базовые абстракции для реализации stackful корутин. 3. Виктор Зверович, известный продвижением std::format в стандарт, всё не находит покой, и теперь предлагает аналогичные безопасные функции, испольщующие все прелести constexpr, но для разбора строк: if (auto result = std::scan<std::string, int>("answer = 42", "{} = {}")) { const auto& [key, value] = result->values(); // key == "answer", value == 42 } И дальше, более коротким, но далеко не исчерпывающим списком: Contracts for C++ (ставящий высокую цель наконец-то ввести в язык аннотации контрактов); A New Approach For Compiling C++ (захватывающий дух бенчмарками, показавшими увеличение скорости компиляции на 25–40%); optional<T&> (намеренное заделать ранее намеренно оставленную брешь), Reflection for C++26 (упрощающий рефлексию максимально, чтобы у нее был шанс пройти в C++26), Low-Level Integer Arithmetic (предлагающий не влекущие UB библиотечные функции для выполнения базовых арифметических операций) и UFCS (описывающий единый синтаксис вызовов функций и методов) А какие из этих пропозалов кажутся наиболее интересными вам? Или каких полезных фич, по вашему мнению, в этом списке не хватает? Присоединяйтесь к обсуждению в комментариях!

#meetupНаш митап состоится уже через 4 недели, 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов), и мы готовы огласить список запланированных активностей: 1. Доклад: Корутины и Qt. Библиотека QCoro 2. Доклад: ООП в ClickHouse 3. Конкурс по мотивам C++ Quiz И, конечно, вас будут ждать вкусные напитки и интересное общение 😉 Если вы планируете посетить мероприятие оффлайн, то вам необходимо зарегистрироваться на него по ссылке, иначе вы не сможете на него попасть. Остались вопросы? Пишите в комментарии, на все ответим!

Finally! В CMake (3.28+) наконец-то реализовали поддержку модулей! Кроме новейшего CMake вам также потребуются новейшие компиляторы: msvc 14.34+, clang 16+, gcc 14+ Подробнее по ссылке

ООП в ClickHouse Паттерны проектирования. О них все слышали, их все используют (надеемся). А давайте посмотрим на них в реальном проекте? Как они помогают понизить связанность компонентов и реализовать принцип SOLID? Как помогают разобраться в незнакомом коде? В докладе мы разберём использование объектно-ориентированных паттернов не в простом веб-приложении, а в СУБД. Это один из самых известных C++ проектов с открытым исходным кодом — ClickHouse

Ровно месяц остался до нашей встречи! И мы не можем не представить оставшийся запланированный доклад:  Дмитрий Косенко расскажет и покажет, как паттерны проектирования применяются в реальном коде. На примере ClickHouse!

#digest Подборка самых интересных новостей и материалов из мира C++ за последние две недели (2 октября – 15 октября 2023) Читать далее на Хабре

Корутины и Qt. Библиотека QCoro Qt появился уже почти 30 лет назад. Хотя фреймворк и сейчас поддерживается и получает крупные обновления как от разработчиков, так и от комьюнити, его событийно-ориентированная система заставляет нас использовать вереницы коллбеков или множество вложенных лямбд и на сегодняшний день выглядит достаточно громоздко в сравнении с другими языками и даже библиотеками C++ (привет, userver). Библиотека QCoro призвана привнести возможности корутин в событийную систему Qt и позволить избежать описания лишнего кода, одноразовых функций и логики перекладывания данных из метода в метод. Библиотека не ломает обратную совместимость. Все старые классы, по типу QNetworkManager, QFuture или классов IO-системы полностью совместимы с QCoro. Достаточно лишь заменить QObject::connect с коллбеком на co_await и узреть магию. При этом библиотека надёжна и признана мировым сообществом. Например, она входит в официальные репозитории (extra) для Manjaro Linux, а значит, проходит несколько этапов проверок прежде, чем попасть в эти репозитории.

Чуть больше чем месяц остался до нашей встречи и мы рады познакомить вас с одним из запланированных докладов: Илья Быконя расскажет нам, как подружить Qt и корутины!

Вот и закончилась неделя корутин. Надеемся, наши материалы оказались не только интересны, но и полезны! И, так как это были первые посты в экспериментальном формате «Неделя X», мы приглашаем всех поделиться в комментариях своим мнением: понравился ли вам формат, как его можно было бы улучшить и какую неделю вы хотите видеть следующей послеследующей? Кроме того, мы рады напомнить, что сегодня последний день приёма заявок желающих выступить с докладом на ближайшем митапе! А значит, следующая неделя будет неделей анонсов докладов C++ Moscow №2!

#cpp20 #coroutines Если говорить об инфраструктуре и поддержке корутин в компиляторах, то, к сожалению, C++20 не принес совершенно никакой высокоуровневой библиотечной поддержки; все, что мы имеем: coroutine_traits, coroutine_handle. И это, конечно, прекрасно: мы можем с помощью них писать свои сопрограммы. Однако не всем в удовольствие писать низкоуровневый код, хотелось бы иметь для прикладного использования и готовенькое. И комитет не дремлет; в C++23 был принят пропозал (не реализованный еще ни в одном компиляторе): 1. 🇬🇧 std::generator: Synchronous Coroutine Generator for Ranges, описывающий корутинный генератор:
std::generator<int> iota(int start = 0) {
  while (true)
    co_yield start++;
}

void f() {
  for (auto i: iota() | std::views::take(3))
    std::cout << i << ' '; // Печатает 0 1 2
}

Кроме того, прямо сейчас в комитете рассматривается: 1. 🇬🇧 std::lazy: Coroutine for Deferred Execution, предлагающий довольно минималистичный класс для представления асинхронных вычислений:
lazy<int> coro() {
  int result = 0;
  while (int v = co_await async_read())
    result += v;
  co_return result;
}

void f() {
  lazy<int> task = coro(); // Получим объект корутины
  co_await task; // А теперь наконец ее исполним
}

К сожалению, далеко не факт, примут ли это предложение в C++26: как оно было подано в 2022-ом, так с тех пор и нет никакого прогресса в продвижениии к его принятию. И на этом всё. Больше никакой поддержки в стандартной библиотеке пока что не предвидится. К счастью, уже написано несколько библиотек, предоставляющих помимо высокоуровневых корутинных примитивов средства для планирования (scheduling) задач и неблокирующего I/O: 1. 🇬🇧 Facebook: Folly::Coro — Асинхронный корутинный фреймворк от Facebook, быстрый и помимо всего поддерживающий асинхронные примитивы синхронизации. 2. 🇬🇧 Lewis Baker: CppCoro — Прародитель всех корутинных фреймворков. К сожалению, уже мертвый, но ввиду своей большой популярности продолживший жизнь через форки и многочисленных идейных продолжателей: [1], [2], [3], [4], [5]. 3. 🇬🇧 Dan Vrátil: QCoro — Если вы хотите использовать в Qt корутины вместо сигналов. А какие библиотеки используете вы? Или вы уже успели написать все самостоятельно? 😉

#cpp20 #coroutines Не будем вас томить, следующие статьи и доклады раскрывают корутины наиболее детально: 1. 🇷🇺 Habr: Корутины в C++20 — что это и как с ними работать 2. 🇷🇺 Habr: C++20. Coroutines 3. 🇬🇧 David Mazières: My tutorial and take on C++20 coroutines 4. 🇬🇧 Lewis Baker: Asymmetric Transfer Выбирайте любую по своим языковым предпочтениям — не ошибетесь. Но как наиболее фундаментальный и всеобъемлющий труд я рекомендую серию статей Assymetric Transfer (Lewis Baker). Это лонг-лонг рид, но он абсолютно того стоит: теоретические основы корутин; механизмы их работы: operator coawait, promisetype, симметричный перенос; какие преобразования над нашим корутинным кодом выполняет компилятор — все это раскрывается во всех деталях, и вряд ли после его прочтения у вас останется хоть один вопрос о том, как работают сопрограммы. Если же вы больше предпочитаете видео, то на тему корутин есть несколько хороших докладов: 1. 🇬🇧 Andreas Fertig: C++20’s Coroutines for Beginners — рассматривающий корутины на основе примеров; 2. 🇬🇧 Andreas Weis: Deciphering C++ Coroutines - A Diagrammatic Coroutine Cheat Sheet — больше углубляющийся в анатомию корутин и проводящий связи между их компонентами, как они между собой взаимодействуют. И две прекрасные лекции, детальные и с прекрасной подачей: 1. 🇷🇺 Константин Владимиров: Сопрограммы, часть 1 — Обзор разновидностей сопрограмм и их основных частей, дополненный множеством интересных упражнений: собственный генератор, исследование объектов ожидания и разбор тонких и сложных проблем; 2. 🇷🇺 Константин Владимиров: Сопрограммы, часть 2 — Варианты симметрии в корутинах, их применение в конечных автоматах, многопоточности и асинхронности. И это все, конечно, очень хорошо, но как дела обстоят с инфраструктурой для корутин: ведь обычно нам хочется использовать готовые классы generator, task и так далее, а не писать их самостоятельно, и насколько хорошо их поддерживают компиляторы? Поговорим об этом в следующий раз!

#cpp20 #coroutines Начнем же наш путь! Первые статьи в нашем меню: 1. Habr: Корутины C++20 в примерах 2. Habr: Готовимся к С++20. Coroutines TS на реальном примере Обе они вводные, но если первая рассматривает исключительно то, как корутины (кем-то за нас написанные) использовать, то вторая уже слегка приоткрывает завесу: что у них под капотом? Если эти статьи кажутся вам слишком лайтовыми, оставайтесь на связи, впереди нас ждет хардкор!

Корутины (сопрограммы) — одно из нововведений C++20, крайнего из на данных момент опубликованных стандартов. Хоть статей про
Корутины (сопрограммы) — одно из нововведений C++20, крайнего из на данных момент опубликованных стандартов. Хоть статей про них написано уже много, сами по себе они являются достаточно сложными для понимания и осознания: вместе с ними приходят сразу четыре новые сущности (promise object, coroutine handle, coroutine state, awaitable), которые программист должен постоянно держать в уме. Множество статей и докладов рассматривают корутины на примере реализации генераторов (подобных питонячьим) — одного из самых элементарных и распространенных их приложений, что можно представить. Но что говорить, когда даже сам комитет по стандартизации C++ не смог реализовать нормальный генератор (то, что все же у него получилось, вошло в C++23 под названием std::generator) Но не будем о грустном. Несмотря на то, что корутины тяжело писать, пользоваться ими легко и приятно! Будем радоваться, ведь всю эту неделю мы будем делиться с вами статьями и докладами, посвященными сопрограммам! Разберемся в них, во всех деталях, вместе

Вторая встреча московского сообщества программистов на C++ пройдет 19 ноября (Вс) с 15:20 до 18:00 по адресу Москва, Малый Конюшковский переулок, д. 2 (оффлайн + онлайн трансляция докладов) Мы приглашаем всех принять в ней участие: поделиться своим опытом и экспертизой, просто хорошо пообщаться в кругу единомышленников Кроме того, мы будем рады всем желающим выступить с мини-докладом продолжительностью до двадцати минут на любую тему, связанную с программированием на C++ (заявки принимаются до 15 октября включительно) Свяжитесь с нами, и мы поможем вам на всех этапах: от подбора темы для выступления (если вы ещё с ней не определились) до подготовки красивой и ясной презентации Заходите в чат по ссылке, регистрируйтесь на мероприятие (если вы планируете посетить его очно, то регистрация обязательна), и приходите на нашу встречу, будет интересно!

#digest Подборка самых интересных новостей и материалов из мира C++ за последние две недели (18 сентября – 1 октября 2023) Читать далее на Хабре

#quiz #explanation Стандарт гласит: [temp.fct.spec] Each function template specialization instantiated from a template has its own copy of any static variable. То есть, каждое инстанцирование имеет свои копии статических переменных. В нашем коде имеется два инстанцирования: для T = int и T = double. Так что первый и третий (но не второй) вызов f разделяют между собой одну статическую переменную. Ответ: 112

Каким будет результат работы программы выше?
Anonymous voting

#quiz #code Каким будет результат выполнения программы ниже? Делитесь своими мыслями в комментариях! Правильный ответ и его объяснение будут опубликованы в 18:00 по Москве. #include <iostream> using namespace std; template <class T> void f(T) { static int i = 0; cout << ++i; } int main() { f(1); f(1.0); f(1); }

Работа работой и учеба учебой, но наши организаторы не дремлют и начинают строить более детальные планы на следующий митап.. А каким бы хотели видеть его вы? Поделитесь своими мыслями в комментариях!

#quiz #explanation Стандарт гласит: [dcl.fct#8] The return type, the parameter-type-list, the ref-qualifier, the cv-qualifier-seq, and the exception specification, but not the default arguments, are part of the function type. То есть, ref-квалификаторы (в нашем случае const&& для X::f) являются частью типа функции, так что тип ptr это int(X::*)() const&&. Ответ: 00