Boost :: spirit :: karma: дубликаты не работают внутри повторения или клины?

Вот кусок очень простого кода, который использует boost::spirit::karma для получения форматированного вывода на языке графических точек:

#include <iostream>
#include <iterator>
#include <vector>
#include <boost/spirit/include/karma.hpp>
using namespace std;

int main() {
vector<int> v{0,1,2,3};
unsigned count = 17;
{
namespace karma = boost::spirit::karma;
karma::generate(ostream_iterator<char>(cout), *(karma::duplicate['c' << karma::int_ << '_' << karma::lit(count) << "[xlabel=" << karma::int_ << "];\n"]), v);
}

return 0;
}

Я ожидал бы, что это произведет:

c0_17[xlabel=0];
c1_17[xlabel=1];
c2_17[xlabel=2];
c3_17[xlabel=3];

Вместо этого он произвел:

c0_17[xlabel=1];
c2_17[xlabel=3];

Что означает duplicate[] директива вообще не действует в клине. Я также попробовал repeat[] директива, но это не работает так же хорошо.

Что я делаю неправильно? Я использую версию Boost 1.53.0. Я скомпилировал код с g++ 4,7 и clang++ 3.2, оба дали одинаковые результаты.

1

Решение

#include <iostream>
#include <iterator>
#include <vector>
#include <boost/spirit/include/karma.hpp>
using namespace std;

int main() {
vector<int> v{0,1,2,3};
unsigned count = 17;
{
namespace karma = boost::spirit::karma;
//karma::rule<ostream_iterator<char>, int()> xlabel = karma::duplicate['c' << karma::int_ << '_' << karma::lit(count) << "[xlabel=" << karma::int_ << "];\n"];
//karma::generate(ostream_iterator<char>(cout), *xlabel, v);
karma::generate(ostream_iterator<char>(cout), *karma::attr_cast<int>(karma::duplicate['c' << karma::int_ << '_' << karma::lit(count) << "[xlabel=" << karma::int_ << "];\n"]), v);
}

return 0;
}
0

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

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