1

как расширение моего вопроса и answer from sehe Я хочу вызвать функцию при генерации моего вывода.Ускорить метод объекта Karma

Я добавил метод 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, но, похоже, не соответствует.

ответ

0

Предполагая, что вы делаете isRoby ПОСТОЯННЫЕ:

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

Вы можете использовать phx::bind:

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

Live On Coliru

#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() const { 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_ [ _1 = phx::bind(&Emp::isRoby, _val) ] ]; 
    } 

    Emp x{ "one", AUTHOR2 }; 
    author2name[AUTHOR2] = "TWO!"; 
    std::cout << karma::format(emp, x); 
} 
Смежные вопросы