2013-08-06 1 views
1

Я пытаюсь вывести параметры, они могут быть либо одним параметром, либо вектором параметров. Следующий код не то, что я хотел бы это сделать:Вывод типа boost :: variant с использованием boost :: spirit :: karma

#include <iostream> 
#include <string> 
#include <boost/variant.hpp> 
#include <boost/spirit/include/karma.hpp> 
namespace karma = boost::spirit::karma; 

typedef std::vector<int> ParameterList; 
typedef boost::variant<int, ParameterList> Parameter; 

main() 
{ 
    using karma::int_; 
    using karma::eol; 
    using karma::lit; 

    std::string generated; 
    std::back_insert_iterator<std::string> sink(generated); 

    karma::rule<std::back_insert_iterator<std::string>, ParameterList()> parameterListRule = int_ % lit(", "); 
    karma::rule<std::back_insert_iterator<std::string>, Parameter()> parameterRule = (int_ | parameterListRule) << eol; 

    karma::generate(sink, parameterRule, 1); // Works 
    karma::generate(sink, parameterRule, ParameterList{1, 2}); // Doesn't work 
    std::cout << generated << "\n"; 
} 

(Реальный код имеет другие типы параметров, а не только INT, и я не могу просто сделать все, чем ParameterList.)

I не совсем понимаю, как это сделать, в частности, поскольку аналогичная конструкция для синтаксического анализа отлично подходит для меня с использованием boost :: spirit :: qi.

ответ

3

Во втором вызове вы не ввели вариант в генератор, но правило ожидает его.

#include <iostream> 
#include <string> 
#include <boost/variant.hpp> 
#include <boost/spirit/include/karma.hpp> 
namespace karma = boost::spirit::karma; 

typedef std::vector<int> ParameterList; 
typedef boost::variant<int, ParameterList> Parameter; 

main() 
{ 
    using karma::int_; 
    using karma::eol; 
    using karma::lit; 

    std::string generated; 
    std::back_insert_iterator<std::string> sink(generated); 

    karma::rule<std::back_insert_iterator<std::string>, ParameterList()> parameterListRule = int_ % lit(", "); 
    karma::rule<std::back_insert_iterator<std::string>, Parameter()> parameterRule = (int_ | parameterListRule) << eol; 

    karma::generate(sink, parameterRule, 1); // Works 
    // use variant here: 
    Parameter test(ParameterList{1, 2}); 
    karma::generate(sink, parameterRule, test); 
    std::cout << generated << "\n"; 
} 
+0

Я думал, что смогу значительно упростить свою фактическую проблему, а затем прикрутить ее, представив эту тупую ошибку. Спасибо, и жаль, моя настоящая проблема сейчас [здесь] (http://stackoverflow.com/questions/18101509/boostspiritkarma-output-of-string-in-quotation-marks). – Xoph

 Смежные вопросы

  • Нет связанных вопросов^_^