以下は、boost spiritドキュメントのemployee.cppソースファイルです。それは 'struct employee'の後に、 'struct employee'についての融合を示すマクロと、それに続く従業員パーサです。クラスを解析するために精神を使用していますか?
私はこれを私の目的に適応しようとしていますが、 'struct employee'を使うのではなく、 'struct employee'の代わりに使用したいクラスがいくつかあります。
私はクラスのために 'struct employee'を置き換えようとしていましたが、融合の際にそれを行うマクロはありませんか?そして、構造体に入れたくない理由は、構造体からクラスにコピーする必要があり、パフォーマンスヒットはもちろんのこと、不要なように思えるからです。
もう少し考えてみたら、フュージョンとタプルの目的を理解していないかもしれないので、それを使って自分のクラス構造にデータを移動しなければならないかもしれません。
ガイダンスはありますか?
namespace client { namespace ast
{
///////////////////////////////////////////////////////////////////////////
// Our employee struct
///////////////////////////////////////////////////////////////////////////
struct employee
{
int age;
std::string surname;
std::string forename;
double salary;
};
using boost::fusion::operator<<;
}}
// We need to tell fusion about our employee struct
// to make it a first-class fusion citizen. This has to
// be in global scope.
BOOST_FUSION_ADAPT_STRUCT(
client::ast::employee,
(int, age)
(std::string, surname)
(std::string, forename)
(double, salary)
)
namespace client
{
///////////////////////////////////////////////////////////////////////////////
// Our employee parser
///////////////////////////////////////////////////////////////////////////////
namespace parser
{
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
using x3::int_;
using x3::lit;
using x3::double_;
using x3::lexeme;
using ascii::char_;
x3::rule<class employee, ast::employee> const employee = "employee";
auto const quoted_string = lexeme['"' >> +(char_ - '"') >> '"'];
auto const employee_def =
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
BOOST_SPIRIT_DEFINE(employee);
}
}