Я читаю о boost type erasure
и я пытаюсь выяснить потенциальное использование. Я хотел бы немного попрактиковаться в этом, пока читаю тонны документации по этой теме (она выглядит большой). Наиболее цитируемая область приложения, которая представляет собой сеть / обмен данными между клиентом и сервером.
Можете ли вы предложить какой-нибудь другой пример или упражнение, где я могу немного поиграть с этой библиотекой?
Тип 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
Вам понадобится некоторая форма стирания типа. Это техника выполнения, которая приравнивает шаблоны времени компиляции.
Других решений пока нет …