2013-04-08 34 views
1

这里有一段非常简单的代码,使用boost::spirit::karma产生的graphviz的圆点语言格式输出:Boost :: spirit :: karma:重复在重复或kleene之星中不起作用?

#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编译了代码,两者都产生了相同的结果。

回答

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