【问题标题】:Output of a boost::variant type using boost::spirit::karma使用 boost::spirit::karma 的 boost::variant 类型的输出
【发布时间】:2013-08-06 19:27:55
【问题描述】:

我正在尝试输出参数,它们可以是单个参数或参数向量。以下代码不是我想要的:

#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。)

我不太明白如何进行这项工作,特别是因为使用 boost::spirit::qi 的类似解析结构对我来说效果很好。

【问题讨论】:

    标签: boost boost-spirit boost-variant boost-spirit-karma


    【解决方案1】:

    在您的第二次调用中,您没有在生成器中放置一个变体,但规则需要一个。

    #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";
    }
    

    【讨论】:

    • 我认为我可以将我的实际问题简化到此为止,然后把它搞砸了,引入了这个愚蠢的错误。谢谢,对不起,我现在真正的问题是here。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多