1

私の質問とseheからの回答の延長として、出力の生成中に関数を呼び出したいと思います。

メソッドを追加しbool isRoby()、emp ルールを変更しました。

   #include <boost/fusion/adapted.hpp>
    #include <boost/spirit/include/karma.hpp>
    #include <boost/spirit/include/phoenix.hpp>
    #include <map>

    namespace karma = boost::spirit::karma;
    namespace phx   = boost::phoenix;

    enum TYPEX { AUTHOR1, AUTHOR2, AUTHOR3, AUTHOR4 };

    std::map<TYPEX, std::string> author2name;
    struct Emp {
        std::string name;
        TYPEX author;

        bool isRoby()
        {
          return name == "roby";
        };
    };

    BOOST_FUSION_ADAPT_STRUCT(Emp, name, author) // boost 1_59
    //BOOST_FUSION_ADAPT_STRUCT(Emp, (std::string, name)(std::string, author)) // older boost

    int main() {
        using it = boost::spirit::ostream_iterator;

        karma::rule<it, std::string()> quote;
        karma::rule<it, TYPEX()> author;
        karma::rule<it, Emp()> emp;

        {
            using namespace karma;
            quote  %= '"' << string << '"';
            author  = quote [ _1 = phx::ref(author2name)[ _val ] ];

            emp    %= delimit('\t')[ quote << author << bool_[ BIND? ] ];

        }

        Emp x { "one", AUTHOR2 };
        author2name[AUTHOR2] = "TWO!";
        std::cout << karma::format(emp, x);
    }

Phoenix Lazyを見つけましたが、一致しないようです。

4

1 に答える 1