повторно использовать проанализированную переменную с повышенной кармой

У меня есть кодовая база, которая вполне эквивалентна приведенному ниже коду.
Я пытаюсь сгенерировать текстовый файл с двойным содержимым переменной.
Я чувствую, что ответ в семантических действиях и _a и _val, но не может справиться даже с документацией.

Как вы будете делать, чтобы:
«Тото» в ул.
и вывод:
что-то еще

т.е. как повторно использовать проанализированную переменную в карме?

struct data
{
std::string str;
};

BOOST_FUSION_ADAPT_STRUCT(
data,
(std::string, str)
)

template <typename Iterator>
struct data: karma::grammar<Iterator, data() >
{
data():data::base_type(start)
{
start = karma::string << karma::lit("some stuff") << karma::string; //Second string is in fact the first one
}
karma::rule<Iterator, data()> start;
};

Решение (согласно сообщениям ниже 🙂

#include <iostream>
#include <string>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/spirit/include/support_iso8859_1.hpp>

namespace ast
{
struct data
{
std::string str;
};
}

BOOST_FUSION_ADAPT_STRUCT(
ast::data,
(std::string, str)
)

namespace karma = boost::spirit::karma;

namespace parser
{

template <typename Iterator>
struct data: karma::grammar<Iterator, ast::data() >
{
data():data::base_type(start)
{
start =
karma::string[karma::_1 =  boost::phoenix::at_c<0>(karma::_val)] <<
karma::lit("some stuff") <<
karma::string[karma::_1 =  boost::phoenix::at_c<0>(karma::_val)]
;
}
karma::rule<Iterator, ast::data()> start;
};
}

main()
{
ast::data d;
d.str = "toto";
std::string generated;
typedef std::back_insert_iterator<std::string> iterator_type;
parser::data<iterator_type> d_p;
iterator_type sink(generated);
karma::generate(sink, d_p, d);
std::cout << generated << std::endl;
}

3

Решение

Это должно сделать трюк:

start = karma::string[karma::_1 = karma::_val]
<< karma::lit("some stuff")
<< karma::string[karma::_1 = karma::_val];
1

Другие решения

Других решений пока нет …