• Супер-выразительный код с привлечением уровней абстракций

    Предлагаю вашему вниманию перевод статьи Super expressive code by Raising Levels of Abstraction


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


    Проблема


    Ниже будет представлен проблемный код. Мы преобразим этот невыразительный и непонятный код в ясный и элегантный.

    Читать дальше →
  • Ключевое слово «mutable» в C++

    • Перевод
    Ключевое слово mutable относится к малоизвестным уголкам языка С++. В то же время оно может быть очень полезным, или даже необходимым в случае, если вы хотите строго придерживаться const-корректности вашего кода или писать лямбда-функции, способные изменять своё состояние.

    Пару дней назад Eric Smolikowski написал в своём твиттере:

    «Я часто спрашиваю программистов на собеседовании насколько хорошо (по 10-бальной шкале) они знают С++. Обычно они отвечают 8 или 9. И тогда я спрашиваю что такое „mutable“. Они не знают. :)»

    Впечатления от таких вопросов и ответов у меня двоякие. С одной стороны, задавать подобные вопросы на собеседовании — дело бесполезное, это почти ничего не говорит о способностях интервьюируемого. Но, с другой стороны, ключевое слово mutable незаслуженно забыто многими программистами, а ведь оно может быть очень полезным в некоторых сценариях.
    Читать дальше →
  • Восемь возможностей C++17, которые должен применять каждый разработчик

      Мы поговорим о восьми удобных изменениях, которые влияют на ваш повседневный код. Четыре изменения касаются самого языка, а ещё четыре — его стандартной библиотеки.


      Вам также может быть интересна статья Десять возможностей C++11, которые должен использовать каждый C++ разработчик
      Читать дальше →
    • Рефлексия в C++14

      Данная статья является расшифровкой (с небольшими правками) доклада Антона antoshkka Полухина — “Немного магии для C++14”.

      Я тут недавно ковырялся с C++ и случайно открыл пару новых приемов метапрограммирования, которые позволяют делать рефлексию в C++14. Пара мотивационных примеров. Вот у вас есть какая-то POD структура, в ней какие-то поля:

      struct complicated_struct {
          int i;
          short s;
          double d;
          unsigned u;
      };
      

      Количество полей и их имена не имеют значение, важно то, что с этой структуры мы можем написать следующий кусочек кода:

      #include <iostream>
      #include "magic_get.hpp"
      
      struct complicated_struct { /* … */ };
      
      int main() {
          using namespace pod_ops;
          complicated_struct s {1, 2, 3.0, 4};
          std::cout << "s == " << s << std::endl; // Compile time error?
      }
      

      Функция main, в ней создаем переменную нашей структуры, как-то ее инициализируем через aggregate инициализацию, а потом эту переменную пытаемся вывести в std::cout. И в этот момент у нас, по идее, должна быть ошибка компиляции: мы не определили оператор вывода в поток для нашей структуры, компилятор не знает как все это скомпилировать и вывести. Однако, оно скомпилируется и выведет содержимое структуры:

      antoshkka@home:~$ ./test
      s == {1, 2, 3.0, 4}

      Читать дальше →
    • Ускорение сборки C и C++ проектов

        Многие программисты не понаслышке знают о том, что программа на языке C и C++ собирается очень долго. Кто-то решает эту проблему, сражаясь на мечах во время сборки, кто-то — походом на кухню «выпить кофе». Это статья для тех, кому это надоело, и он решил, что пора что-то предпринять. В этой статье разобраны различные способы ускорения сборки проекта, а также лечение болезни «поправил один заголовочный файл — пересобралась половина проекта».

        Picture 1
        Читать дальше →
      • Новинки С++17, которые необходимо использовать каждому

        • Перевод
        Дамы и господа, здравствуйте.

        Мы как раз закончили перевод интересной книги Яцека Галовица о STL С++ 17, которую надеемся выпустить чем раньше, тем лучше.


        Сегодня же мы хотим предложить вашему вниманию перевод статьи Джулиана Темплмана с сайта «O'Reilly» с небольшим анонсом возможностей стандартной библиотеки нового стандарта С++.

        Всех — с наступающим новым годом!
        Читать дальше →
      • Понимание lvalue и rvalue в C и С++

          Привет, Хабр! Представляю вашему вниманию перевод статьи Eli Bendersky, Understanding of lvalues and rvalues in C and C++.

          От переводчика: предлагаю Вашему вниманию перевод интересной статьи об lvalue и rvalue в языках C/C++. Тема не нова, но знать об этих понятиях никогда не поздно. Статья рассчитана на новичков, либо на программистов переходящих с C (или других языков) на C++. Поэтому будьте готовы к подробному разжёвыванию. Если вам интересно, добро пожаловать под кат
          Читать дальше →
        • Использование std::optional в С++17

          • Перевод
          • Tutorial


          Давайте возьмём пару от двух типов <YourType, bool> — что вы можете сделать с композицией подобного рода?


          В этой статье я расскажу вам про std::optional — новый вспомогательный тип, добавленный в C++17. Это обёртка для вашего типа и флаг показывает, инициализировано ваше значение или нет. Давайте посмотрим, где это может быть полезно.


          Вступление


          Добавлением логических флагов к другим типам вы можете достичь то, что называется "Nullable типы". Как было сказано ранее, флаг используется для обозначения того, доступно значение или нет. Такая обёртка выразительно представляет объект, который может быть пустым (не через комментарии :).

          Читать дальше →
        • Chain of Responsibility на C++ variadic templates

          • Tutorial
          Речь пойдёт о таком простом, но часто используемом паттерне как chain of responsibility(цепочка ответственности). Суть паттерна в том, что для обработки какого либо события мы используем несколько обработчиков, каждый из которых принимает решение о том, что и когда передавать следующему. В сети есть масса примеров реализации на C++, но я хочу показать реализацию только на лямдба-выражениях. В этой реализации можно будет посмотреть немного уличной template-magic.
          Читать дальше →
        • Использование Docker для сборки и запуска проекта на C++

          В этой публикации речь пойдет о том, как выполнить сборку C++ проекта, использующего GTest и Boost, при помощи Docker. Статья представляет собой рецепт с некоторыми поясняющими комментариями, представленное в статье решение не претендует на статус Production-ready.


          Зачем и кому это может понадобиться?


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


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


          Представленное в статье окружение можно использовать как каркас для тестовых заданий или лабораторных работ.

          Читать дальше →
        • Особенности вызова функций в С++

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


            • Регистры и их назначение при вызове функций.
            • Передача и возврат простых типов и структур.
            • Как передача по ссылке и по значению влияют на оптимизации тела функции компилятором.
            • Как используется место при многочисленных вызовах функций.
            • Механизм виртуальных вызовов.
            • Оптимизация хвостовых вызовов и рекурсии.
            • Инициализация структур, массивов и векторов.

            Осторожно! Статья содержит большое количество кода на C++ и ассемблере (Intel ASM с комментариями), а также множество таблиц с оценками производительности. Всё написанное актуально для x86-64 System V ABI, который используется во всех современных Unix операционных системах, к примеру, в Linux и macOS.

            Читать дальше →
          • 2. По мотивам Мейерса «Эффективный и современный С++» — детали вывода типа шаблона для массивов

              Добрый день, дорогой читатель!


              Эта статья — вторая в цикле статей-конспектов, которые я буду писать в ходе прочтения бестселлера Скотта Мейерса "Эффективный и современный c++". Каждой из таких статей будет соответствовать отдельная директория в специально заведенном на github.com проекте с живыми примерами использования того, что мы с Вами сегодня читаем.

              Читать дальше →
            • C++11 и обработка событий

                Думаю, обработка событий как способ взаимодействия объектов в ООП, известен почти каждому, кто вообще хоть раз касался ООП. По крайнее мере, такой подход весьма удобен в весьма широком, на мой взгляд, спектре задач. Во многих языках программирования механизм обработки событий является встроенным; однако в C++ такого механизма нет. Давайте посмотрим, что можно с этим сделать.
                Читать дальше →
              • Работа со строками на этапе компиляции в современном C++


                  Если вы программируете на C++, то наверняка задавались вопросом почему нельзя сравнить два строковых литерала или выполнить их конкатенацию:


                  auto str = "hello" + "world"; // ошибка компиляции
                  
                  if ("hello" < "world") { // компилируется, но работает не так, как ожидалось
                      // ...
                  }

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

                  Читать дальше →
                • Проблемные аспекты программирования на С++


                    В С++ достаточно много особенностей, которые можно считать потенциально опасными — при просчетах в проектировании или неаккуратном кодировании они легко могут привести к ошибкам. В статье приводится подборка таких особенностей, даны советы, как уменьшить их негативное влияние.



                    Читать дальше →
                  • Внутренняя и внешняя линковка в C++

                    • Перевод
                    Всем добрый день!

                    Представляем вам перевод интересной статьи, который подготовили для вас рамках курса «Разработчик C++». Надеемся, что она будет полезна и интересна для вас, как и нашим слушателям.

                    Поехали.

                    Сталкивались ли вы когда-нибудь с терминами внутренняя и внешняя связь? Хотите узнать, для чего используется ключевое слово extern, или как объявление чего-то static влияет на глобальную область? Тогда эта статья для вас.

                    В двух словах

                    В единицу трансляции включены файл реализации (.c/.cpp) и все его заголовочные файлы (.h/.hpp). Если внутри единицы трансляции у объекта или функции есть внутреннее связывание, то этот символ виден компоновщику только внутри этой единицы трансляции. Если же у объекта или функции есть внешнее связывание, то компоновщик сможет видеть его при обработке других единиц трансляции. Использование ключевого слова static в глобальном пространстве имен дает символу внутреннее связывание. Ключевое слово extern дает внешнее связывание.
                    Компилятор по умолчанию дает символам следующие связывания:

                    • Non-const глобальные переменные — внешнее связывание;
                    • Const глобальные переменные — внутреннее связывание;
                    • Функции — внешнее связывание.


                    Читать дальше →
                  • Feature freeze C++20. Coroutines, Modules и прочее

                      На днях прошла встреча международного комитета по стандартизации C++ в американском городе Кона. Это была не просто встреча, а feature freeze! Никакие серьёзные новые идеи больше не могут просачиваться в стандарт, остаётся лишь пара встреч на добавление предварительно одобренных вещей, исправление недочётов и устранение шероховатостей.

                      Ожидать ли Модули и Корутины в C++20, будет ли там быстрая библиотека для форматирования вывода, сможет ли она работать с календарями, добавили ли std::stacktrace, начнёт ли компилятор сам вызывать std::move в ряде случаев, приняли ли std::flat_map? Всё это и многое другое ожидает вас под катом.


                      Читать дальше →
                    • Топ 20 ошибок при работе с многопоточностью на С++ и способы избежать их

                      Привет, Хабр! Предлагаю вашему вниманию перевод статьи «Top 20 C++ multithreading mistakes and how to avoid them» автора Deb Haldar.


                      Сцена из фильма «Петля времени» (2012)

                      Многопоточность— одна из наиболее сложных областей в программировании, особенно в C++. За годы разработки я совершил множество ошибок. К счастью, большинство из них были выявлены на код ревью и тестировании. Тем не менее, некоторые каким-то образом проскакивали на продуктив, и нам приходилось править эксплуатируемые системы, что всегда дорого.

                      В этой статье я попытался категоризировать все известные мне ошибки с возможными решениями. Если вам известны еще какие-то подводные камни, либо имеете предложения по решению описанных ошибок– пожалуйста, оставляйте свои комментарии под статьей.
                      Читать дальше →
                    • Современные возможности C++, о которых надо знать всем программистам

                      • Перевод
                      Автор материала, перевод которого мы сегодня публикуем, говорит, что C++, в его современном виде, если сравнивать его с тем, чем был этот язык несколько лет назад, значительно изменился в лучшую сторону. Конечно, эти изменения произошли далеко не сразу. Например, в былые времена C++ не хватало динамичности. Непросто было найти человека, который мог бы сказать, что он питает к этому языку нежные чувства. Всё изменилось тогда, когда те, кто отвечает за стандартизацию языка, решили дать ход новшествам. В 2011 году C++ стал динамическим языком, языком, который постоянно развивается и вызывает у программистов куда больше положительных эмоций.

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



                      Сегодня мы поговорим о некоторых новых возможностях языка (начиная с C++ 11, которому, кстати, уже 8 лет), знать о которых будет полезно любому программисту.
                      Читать дальше →
                    • Мой подход к реализации делегатов в C++: вызов функции с неизвестными параметрами во время выполнения

                      Предыстория


                      Мне нравится язык C++. Я бы даже сказал, что это мой любимый язык. Кроме того, для своих разработок я использую технологии .NET, и многие идеи в нём, по моему мнению, просто восхитительны. Однажды мне пришла в голову идея – как реализовать некоторые средства рефлексии и динамического вызова функций в C++? Очень уж хотелось, чтобы C++ тоже обладал таким преимуществом CLI, как вызов делегата с неизвестным количеством параметров и их типов. Это может пригодиться, например, когда заранее неизвестно, какие типы данных нужны функции, которую нужно вызвать.

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