Boost Karma对象方法调用

时间:2015-10-12 12:57:48

标签: c++ boost boost-spirit-qi boost-phoenix boost-spirit-karma

作为我的问题的扩展,answer from 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,但似乎不匹配。

1 个答案:

答案 0 :(得分:0)

假设你制作了Ex:- "AccountID" in the header const:

isRoby

您可以使用bool isRoby() const { return name == "roby"; };

phx::bind

<强> Live On Coliru

bool_ [ _1 = phx::bind(&Emp::isRoby, _val) ]