практика и открытие Boost Type Erasure

Я читаю о boost type erasure и я пытаюсь выяснить потенциальное использование. Я хотел бы немного попрактиковаться в этом, пока читаю тонны документации по этой теме (она выглядит большой). Наиболее цитируемая область приложения, которая представляет собой сеть / обмен данными между клиентом и сервером.
Можете ли вы предложить какой-нибудь другой пример или упражнение, где я могу немного поиграть с этой библиотекой?

6

Решение

Тип Erasure полезен в необычайном количестве ситуаций, вплоть до того, что его фактически можно рассматривать как принципиально отсутствующую языковую функцию, которая связывает общие и объектно-ориентированные стили программирования.

Когда мы определяем класс в C ++, то, что мы на самом деле определяем, является очень специфическим type и очень конкретный interfaceи что эти две вещи не обязательно должны быть связаны. type имеет дело с данными, где в качестве interface имеет дело с преобразованиями на этих данных. Общий код, такой как в STL, не заботится о typeэто волнует interface: вы можете отсортировать что-либо контейнер или контейнероподобную последовательность, используя std::sortДо тех пор, пока он обеспечивает сравнение и итератор interface,

К сожалению, универсальный код в C ++ требует полиморфизма времени компиляции: templates, Это не помогает с вещами, которые не могут быть известны до времени выполнения, или вещами, которые требуют единого интерфейса.

Простой пример: как вы храните несколько разных типов в одном контейнере? Самый простой механизм — хранить все типы в пустоте *, возможно, с некоторой информацией о типах, чтобы различать их. Другой способ — распознать все эти types имеют те же interface: поиск. Если бы мы могли сделать единый интерфейс для retrievalзатем специализируйте его для каждого типа, тогда это будет type был стерт

any_iterator это еще одна очень полезная причина для этого: если вам нужно перебрать несколько разных контейнеров с одним и тем же интерфейсом, вам нужно стереть type из контейнера из type итератора. boost :: any_range — это тонкое расширение, расширяющее его от итераторов до диапазонов, но основная идея та же.

Короче говоря, в любое время вам нужно перейти от нескольких types с похожим interface одному type с одним interfaceВам понадобится некоторая форма стирания типа. Это техника выполнения, которая приравнивает шаблоны времени компиляции.

18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]