пятница, 12 апреля 2019 г.

[prog.c++] Шаблоны против копипасты 9: SFINAE и CRTP чтобы бить юзверя по рукам в компайл-тайм

Очередная серия про то, как C++ные шаблоны позволяют бороться с копипастой. Опять в виде статьи на Хабре: "Немного C++ной шаблонной магии и CRTP для контроля за корректностью действий программиста в компайл-тайм". На Хабре потому, что нужен PR. Какой-никакой, но PR. И нужен.

Сказать свое "Фи", "Не нужно", "За такое нужно руки отрывать" или "Когда я вижу такой код, то хочется обнять и плакать" можно как в комментариях на Хабре, так и здесь. Но меня вы все равно не переубедите :) Так что лучше, если вы где-нибудь сделаете репост ссылки на статью со своими уничижительными комментариями. Мол, вон как хардкорные C++ники упарываются, нидайбох дойти до жизни такой ;)

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

  • в basic_holder_t потребовалось два метода data (константный и неконстантный), причем оба эти метода сделаны публичными (чтобы не трахаться с friend-ами для шаблонов);
  • методы clone_if_necessary в примеси cloner_t оказались статическими.

Поиграться в on-line с продвинутой версией можно здесь.

PS. Предыдущая часть серии "Шаблоны против копипасты" здесь.