Мы используем boost.any в качестве типа носителя для безопасного контейнера с тегами типа variadic. Вот что это значит:
У нас есть "плот" объект, который проходит через набор фильтров. Когда фильтр хочет добавить данные в плот, он может сделать что-то вроде этого:
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
являются членами перечисления, и мы используем шаблон признаков для отображения тегов на типы.
Класс плота использует list
из pair<ETagType, boost::any>
в качестве резервного хранилища. Boost.any избавил нас от необходимости управлять необработанными буферами для различных типов.