Pull to refresh
7
Karma
0
Rating
Роман Сергеев @Cupper

User

Произвольный порядок списка инициализации шаблона

C++ *
Думаю многие кто работает с шаблонами, знакомы со следующей ситуацией. У нас есть некий шаблонный класс с кучей шаблонных параметров

struct deferred;
struct deadline;
struct disable;

template<class T, class Deferred = disable, class Deadline = disable>
struct some_container

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

typedef some_container<int, disable, deadline> deadline_container;
<source>
А хотелось бы 

<source lang=cpp>
typedef some_container<int, deadline> deadline_container;

А ещё лучше, что бы даже порядок задания не имел значение и следующие два, были бы эквивалентны

typedef some_container<int, deferred, deadline> full_container1;
typedef some_container<int, deadline, deferred> full_container1;

Но мы прекрасно понимаем, что как только мы поменяли два параметр у нас получится совершенно не то чего мы ожидали (это вам не tuple где порядок указание не имеет значении)
Думаю многие уже подумали о том, что всего этого можно добиться добавив прослойку между нашим типом и пользователем, для которой написать все возможные специализации. Если у вас только 2 шаблонных параметр то да, если 3 то уже сложно, а если добавится 4, 5 то пиши пропало. Да и как правило добавление нового параметра приводит к переделыванию всех предыдущих специализаций (так как в специализации мы не можем увеличивать число шаблонных параметров, а можем их только уменьшать).
Если вас заинтересовало, прошу под кат, я покажу вам как добиться этого
лёгким путём
Total votes 28: ↑24 and ↓4 +20
Views 5.8K
Comments 11

О структуризации и автоматизации

Website development *
Хотел бы поделиться небольшим опытом по автоматизации и стандартизации процесса разработки. Статья не претендует быть истиной, но я надеюсь будет интересным чтивом для конца рабочей недели.

В начале было слово


Для начала немножко расскажу с чего все начиналось:
  • Репозитарий в котором была только одна основная ветка.
  • 5 проектов, которые должны взаимодействовать в единой экосистеме. И еще несколько на подходе.
  • Постоянно дополняющиеся требования, приводящие к необратимым изменениям в протоколе общения между всеми компонентами (не самая лучшая ситуация, но так уже было).
  • Каждый из проектов имел свой формат версии. Одни основывались на ревизии, другие на дате, третье и на том и на том.
  • Отсутствие какой-либо согласованности между всеми компонентами (была только на словах).
  • Отсутствие какой-либо автоматизации процессов (что-то все-таки было, но не густо).
  • Отсутствие единого хранилища всех дистрибутивов (одни хранились в svn, другие в Track Studio, третье пересобирались каждый раз из исходников (было забавно смотреть как тестировщики выгружали из svn исходники приложения и делали make clean all что бы получить новый бинарник для тестирования)).

Читать дальше →
Total votes 7: ↑5 and ↓2 +3
Views 7.4K
Comments 0

Ну совсем маленькая заметка по getopts

Lumber room
И так, мы хотим разбирать параметры командной строки в нашем скрипте, и мы хотим учесть
  • Опции без аргументов
  • Опции с аргументами
  • Проверку отсутствия аргумента
  • Проверку неизвестных опций
  • Проверку отсутствия параметров
  • Оформить эту часть скрипта как функцию

И вот вам сразу самый тру способ, к которому я смог прийти
Читать дальше →
Total votes 13: ↑9 and ↓4 +5
Views 4.2K
Comments 4

Проект NULL

C++ *Designing and refactoring *
Не знаю как у вас, но у меня обычно, когда мне нужно, что-то написать с нуля начинается лихорадка и полная прострация в мыслях. В голове уже летают различные абстрактные модели, что от чего и куда. Но ни за одну из них ухватиться не получается, потому что перед тобой чистый лист и вырвав из головы одну мысль, применить ее не к чему, а вытащить весь скелет не получается потому, что ты уже думаешь о решении задачи, а тебе еще только нужно написать костяк приложения.

Ниже представлен «проект NULL», тот самый костяк, с которого обычно все и начинается. У меня.

Данный пост скорее всего не будет интересен тем кто уже матерый и тем кто на прямую не связан с разработкой на С++, т.к. ниже представленные материл несет одну единственную цель — дать готовый фундамент для начала.
Читать дальше →
Total votes 60: ↑46 and ↓14 +32
Views 9.6K
Comments 77

Практика работы с сигналами

C++ *
Хочу запечатлеть небольшой опыт работы с сигналами в Linux. Ниже будут представлены примеры использования наиболее значимых конструкций в этой области. Постараюсь разложить все по отдельным полочкам, чтобы всегда было легко глянуть и вспомнить, что и как использовать.
Читать дальше →
Total votes 73: ↑62 and ↓11 +51
Views 95K
Comments 61

Особенности работы с Multicast

C++ *
Хочу поделиться небольшим опытом работы с технологией групповой передачи данных, или иначе UDP Multicast, и проблемой особенностью, которая возникает при написании кроссплатформенного кода.
Читать дальше →
Total votes 12: ↑9 and ↓3 +6
Views 60K
Comments 4

[asio::udp] Не кроссплатформенное поведение

C++ *
Sandbox
Итак, представьте ситуацию: у нас есть кроссплатформенный сервер который должен получать данные по UDP. Вооружившись Asio вы создаете сокет, создаете буфер для принимаемых данных и начинаете слушать.

udp::socket receiver(ios, udp::endpoint(udp::v4(), port));
char read_buf[buf_len];
udp::endpoint sender_point;
receiver.receive_from(buffer(read_buf, sizeof(read_buf)), sender_point);


Что произойдет если в полученной дейтаграмме будет больше данных, чем вы выделили для буфера?
Читать дальше →
Total votes 37: ↑31 and ↓6 +25
Views 2.8K
Comments 16

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity