gpt4 book ai didi

c++ - Boost Karma 对象方法调用

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:47 25 4
gpt4 key购买 nike

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

最佳答案

假设您将 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);
}

关于c++ - Boost Karma 对象方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33081738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com