1

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[]が、うまくいきません。

私は何を間違っていますか?ブースト バージョン 1.53.0 を使用しています。g++4.7 とclang++3.2 でコードをコンパイルしましたが、どちらも同じ結果になりました。

4

1 に答える 1

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;
}
于 2013-04-08T13:35:17.210 に答える