提升::精神::业力:复制在重复或克莱恩星中不起作用?

Boost::spirit::karma: duplicate doesn't work within repeat or kleene star?

本文关键字:克莱恩 不起作用 业力 精神 复制 提升      更新时间:2023-10-16

下面是一段非常简单的代码,它使用boost::spirit::karma以graphviz点语言生成格式化的输出:

#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[]指令在kleene星形中根本无效。我也试过repeat[]指令,但那不起作用。

我做错了什么?我使用的是boost版本1.53.0。我用g++ 4.7和clang++ 3.2编译了代码,两者都产生了相同的结果。

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