Еще один способ взглянуть на boost :: fusion - это подумать об этом как о библиотеке «самоанализа бедных». Оригинальная мотивация boost :: fusion исходит из направления boost :: spirit parser/generator framework, в частности, для поддержки того, что называется атрибутами парсера.
Представьте, у вас есть строка CSV для анализа:
Аааа, 1,1
типа, эта строка разбирает в, может быть описана как «кортеж строки и двойной» , Мы можем определить такие кортежи в «plain» C++, либо со старыми школьными структурами (struct { string a; double b; }
, либо новее tuple<string, double>
). Единственное, что мы пропустили, это какой-то адаптер, который позволит передавать кортежи (и некоторые другие типы) произвольного состава в унифицированный интерфейс синтаксического анализатора и ожидать, что он будет разбираться в этом без передачи какой-либо внеполосной информации (например, строки шаблоны синтаксического анализа, используемые scanf).
Вот где boost :: fusion вступает в игру.Самый простой способ построить «последовательность фьюжн», чтобы адаптировать нормальный-структуру:
struct a {
string s;
double d;
};
BOOST_FUSION_ADAPT_STRUCT(a, (string, s)(double, d))
«ADAPT_STRUCT» макрос добавляет необходимую информацию для структуры синтаксического анализатора (в данном примере), чтобы иметь возможность «итерация» над члены struct a
к мелодии на следующие вопросы:
Я просто разобран строку. Могу ли я назначить его первому члену struct a
?
Я просто разобрал двойной. Могу ли я назначить его второму члену struct a
?
Есть ли другие члены в struct a
или я должен прекратить разбор?
Очевидно, что этот простой пример может быть продлен (и повышение :: фьюжн поставляет способность) для решения гораздо более сложные случаи:
Варианты - скажем, анализатор может столкнуться либо жала или double и хочет присвоить его правильному члену struct a
. BOOST_FUSION_ADAPT_ASSOC_STRUCT
приходит на помощь (теперь наш синтаксический анализатор может задавать вопросы типа «какой член struct a
имеет тип double?»).
Преобразования - наш анализатор может быть разработан, чтобы принимать определенные типы в качестве параметров, но остальные программы сильно изменились. Тем не менее, фьюжн-метафунды можно удобно использовать для адаптации новых типов к старым реалиям (или наоборот).
Остальные функции boost :: fusion, естественно, вытекают из вышеуказанных основ. fusion действительно сияет, когда необходимо преобразовать (в любом направлении) «свободные данные IO» в строго типизированные/структурированные данные, на которых действуют программы на C++ (если эффективность вызывает беспокойство). Это фактор, обеспечивающий дух: qi и spirit :: karma - такая эффективная (возможно, самая быстрая) инфраструктура ввода-вывода.
Я бы скорее обнаружил ошибку во время компиляции, чем во время выполнения. –
Является ли STL для кортежей. Если вы сопоставляете классы с кортежами, вы можете использовать его для отражения во времени компиляции. – gnzlbg