Мы используем boost.any как тип несущей для контейнера с переменным типом с маркировкой. Вот что это значит:
У нас есть объект «плот», который проходит через набор фильтров. Когда фильтр хочет добавить данные на плот, он может сделать что-то вроде этого:
raft.addTaggedData<ETag1>(3.0);
raft.addTaggedData<ETag2>("a string")`;
std::string str = raft.getTaggedData<ETag2>();
int a = raft.getTaggedData<ETag1>(); // <-- Compile error
Где ETag1
и ETag2
являются членами перечисления, и мы используем шаблон признаков для сопоставления теги к типам.
Класс raft использует list
из pair<ETagType, boost::any>
в качестве хранилища резервных копий. Boost.any спасли нам боль от управления буферами сырья для разных типов.