2013-08-06 9 views
1

매개 변수를 출력하려고하는데 단일 매개 변수 또는 매개 변수의 벡터가 될 수 있습니다. 다음 코드는 내가 할 싶습니다하지 않는 것을 :boost :: spirit :: karma를 사용한 boost :: variant 유형의 출력

#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