Чтобы вызвать функцию-член объекта, вам нужно предоставить две вещи:
- адрес функции-члена, как сказано выше, вы можете получить это, написав
&my_class::my_member
- указатель (или ссылка) на экземпляр объекта, для которого вы хотите, чтобы функция-член была вызвана для
Духовные семантические действия предполагают, что вы предоставите функцию или функциональный объект, открывающий определенный интерфейс. В вашем случае ожидаемый интерфейс:
void func(Iterator first, Iterator Last);
где Iterator - это тип итератора, используемый для вызова функции синтаксического анализа (доступен через typename ScannerT::iterator_t
). То, что вам нужно сделать, это создать объект функции, предоставляющий упомянутый интерфейс, при этом вызывая функцию-член. Хотя это можно сделать вручную, в лучшем случае это утомительно. Самый простой способ создать объект функции - использовать Boost.Bind:
prog = (alpha_p >> *alnum_p)
[
boost::bind(&ParserActions::do_prog, self.action)
];
, который создаст требуемый объект функции для вас, связывая и упаковывая вашу функцию-член.
Все это предполагает, что ваша функция-член не принимает никаких аргументов. Если вам нужно передать пару итераторов, с вашей функцией будет вызвано семантическое действие, конструкция должна быть записана как:
prog = (alpha_p >> *alnum_p)
[
boost::bind(&ParserActions::do_prog, self.action, _1, _2)
];
дает указание объекту функции переслать свой первый и второй параметр в связанную функцию.