#include <boost/variant.hpp>
#include <boost/spirit/include/karma.hpp>
 
namespace karma = boost::spirit::karma;
typedef boost::variant<int, std::string> Parameter;
typedef std::vector<Parameter> Parameters;
 
void test(boost::variant<Parameters, Parameter> const& v)
{
    typedef boost::spirit::ostream_iterator It;
    using namespace karma;
 
    const static rule<It, std::string()> quoted
        = '"' << *('\\' << char_('"') | char_) << '"'
        ;
    const static rule<It, Parameter()>   param
        = int_ | quoted
        ;
    const static rule<It, boost::variant<Parameters, Parameter>()> rule
        = param | param % ", "
        ;
 
    std::cout << karma::format(rule, v) << '\n';
}
 
int main()
{
    test(1);
    test("foo");
    test("escape: \"foo\"");
    test(Parameters { 1, 2, 3, "escape: \"foo\"" });
}
 
 
				I2luY2x1ZGUgPGJvb3N0L3ZhcmlhbnQuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWEuaHBwPgoKbmFtZXNwYWNlIGthcm1hID0gYm9vc3Q6OnNwaXJpdDo6a2FybWE7CnR5cGVkZWYgYm9vc3Q6OnZhcmlhbnQ8aW50LCBzdGQ6OnN0cmluZz4gUGFyYW1ldGVyOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPFBhcmFtZXRlcj4gUGFyYW1ldGVyczsKCnZvaWQgdGVzdChib29zdDo6dmFyaWFudDxQYXJhbWV0ZXJzLCBQYXJhbWV0ZXI+IGNvbnN0JiB2KQp7CiAgICB0eXBlZGVmIGJvb3N0OjpzcGlyaXQ6Om9zdHJlYW1faXRlcmF0b3IgSXQ7CiAgICB1c2luZyBuYW1lc3BhY2Uga2FybWE7CgogICAgY29uc3Qgc3RhdGljIHJ1bGU8SXQsIHN0ZDo6c3RyaW5nKCk+IHF1b3RlZAogICAgICAgID0gJyInIDw8ICooJ1xcJyA8PCBjaGFyXygnIicpIHwgY2hhcl8pIDw8ICciJwogICAgICAgIDsKICAgIGNvbnN0IHN0YXRpYyBydWxlPEl0LCBQYXJhbWV0ZXIoKT4gICBwYXJhbQogICAgICAgID0gaW50XyB8IHF1b3RlZAogICAgICAgIDsKICAgIGNvbnN0IHN0YXRpYyBydWxlPEl0LCBib29zdDo6dmFyaWFudDxQYXJhbWV0ZXJzLCBQYXJhbWV0ZXI+KCk+IHJ1bGUKICAgICAgICA9IHBhcmFtIHwgcGFyYW0gJSAiLCAiCiAgICAgICAgOwoKICAgIHN0ZDo6Y291dCA8PCBrYXJtYTo6Zm9ybWF0KHJ1bGUsIHYpIDw8ICdcbic7Cn0KCmludCBtYWluKCkKewogICAgdGVzdCgxKTsKICAgIHRlc3QoImZvbyIpOwogICAgdGVzdCgiZXNjYXBlOiBcImZvb1wiIik7CiAgICB0ZXN0KFBhcmFtZXRlcnMgeyAxLCAyLCAzLCAiZXNjYXBlOiBcImZvb1wiIiB9KTsKfQoK