Вызов метода объекта Boost 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);
}

Я только что нашел Феникс Ленивый, но похоже не совпадает.

1

Решение

Предполагая, что вы делаете isRoby Const:

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

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

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

Жить на Колиру

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector