Skip to content

parsing into private fields #182

Open
@Jannik2099

Description

@Jannik2099

Currently my biggest gripe with Spirit.X3 is that you can't parse into a class with private fields. This leaves you with two options:

  1. use a proxy type, e.g.
class Myclass_impl {
public:
    char c;
};

class Myclass : private Myclass_impl {
public:
    Myclass_impl &base() { return *this; }
};

bp::rule<struct tag, Myclass_impl> rule{"rule"};
const auto rule_def = bp::char_;
BOOST_PARSER_DEFINE_RULES(rule);

void func() {
std::string str{"c"};
Myclass result;

bp::parse(str, rule, result.base());
}
  1. Just don't use private members, which means your parser is no longer a parser, just a validator.

1. makes public headers unreadable as users would have to look into implementation headers to see the actual class body, while
2. violates the parse, don't validate principle and thus allows for invalidly constructed objects that would never be returned from a successful parse.

Are there any plans to remedy this, e.g. via a Boost.Parser helper class that the user class could befriend, or via a specialization that grants access to the private members (Boost.Describe comes to mind) ?

Or am I just missing a workaround that everyone has been using for the past decade

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions