Я бы хотел задать этот вопрос на очень общем уровне: насколько поддерживается поддержка типов контейнеров boost :: spirit/boost :: fusion? Может ли кто-нибудь дать мне общее руководство относительно того, что возможно, а что невозможно?Какие типы контейнеров поддерживаются парсером boost :: spirit и boost :: fusion?
С «Поддержка» Я имею в виду следующее: При следующем определении парсера я могу разобрать непосредственно в std::pair<double,double>
:
template <typename Iterator>
struct pair_parser
: qi::grammar<Iterator, std::pair<double,double>()>
{
pair_parser() : pair_parser::base_type(start)
{
start = pair;
pair = qi::double_ >> ":" >> qi::double >> ";"
}
qi::rule<Iterator, std::pair<double,double>()> pair;
};
ли я правильно понимаю, что вся «магия» делается boost::fusion
? Имея это в виду, позвольте мне определить, что: поддерживается пара парных разрядов.
Я нашел рабочие примеры для следующих целей:
std::vector<std::string>
std::map<std::string, std::string> // the trick is not to forget the pair within
std::vector<std::vector<int> >
struct A{int, double, std::string} // with boost::fusion adaptor
и я выработал следующее:
std::map<std::string, boost::variant<int, double, std::string> >
Итак, я также сказать, что:
- вектор строк
- простого имя-значение карты
- вектора вектора POD-типов
- наддув :: варианта Структуры
поддерживается по boost::spirit
/boost::fusion
.
Но он также работает с другими контейнерами STL? Как правило, все они поддерживаются или есть некоторые, которые не работают? Как насчет boost :: контейнеров? Как насчет вложенных контейнеров? Насколько глубоко они могут быть вложены? Как насчет вложенных структур? Что мне нужно понять, чтобы определить, можно ли использовать контейнер с boost::spirit
/boost::fusion
?
фона: Я пытаюсь разобрать на несколько более сложных типов, как это struct table
с boost::multi_array
и «вектор карты двойной и структуры»:
struct skewFactor{
double horizontalSkew;
double verticalSkew;
double factor;
};
struct table {
std::vector<std::vector<double> > index;
boost::multi_array<double,4> baseArray; // yes, this array is 4-dimensional
std::vector<std::map<double, skewFactor> > effect;
};
В настоящее время я просто работаю это с пробной ошибкой.
Очень непонятно, какую «поддержку» вы ожидаете от названных библиотек. Я для одного не знаю поддержки для любого контейнера за пределами 'array <>' от fusion. И вложенная поддержка никогда не существовала для Духа. Если вы не сможете прояснить, что вы подразумеваете под этим. – sehe
@sehe, извините, что не понял. Английский язык не мой родной язык. Я постараюсь перефразировать его. – user23573
Английский язык в порядке. Постарайтесь уточнить, что составляет поддержку – sehe