#include <boost/config/warning_disable.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/bind.hpp> #include <boost/lambda/bind.hpp> #include <boost/spirit/include/phoenix.hpp> #include <iostream> struct writer { void print(int const& i) const { std::cout << i << std::endl; } void do_nothing() const { } }; int main() { namespace qi = boost::spirit::qi; using qi::int_; using qi::lit; using qi::parse; using qi::unused_type; namespace lambda = boost::lambda; namespace phoenix = boost::phoenix; writer w; { // example using boost::bind char const *first = "{11}", *last = first + std::strlen(first); parse(first, last, lit('{')[boost::bind(&writer::do_nothing, &w)] >> int_[boost::bind(&writer::print, &w, ::_1)] >> '}'); } { // example using lambda::bind char const *first = "{22}", *last = first + std::strlen(first); parse(first, last, lit('{')[lambda::bind(&writer::do_nothing, &w)] >> int_[lambda::bind(&writer::print, &w, lambda::_1)] >> '}'); } { // example using phoenix::bind char const *first = "{33}", *last = first + std::strlen(first); parse(first, last, lit('{')[phoenix::bind(&writer::do_nothing, &w)] >> int_[phoenix::bind(&writer::print, &w, qi::_1)] >> '}'); } { // example using std::bind char const *first = "{44}", *last = first + std::strlen(first); parse(first, last, lit('{')[std::bind(&writer::do_nothing, &w)] >> int_[std::bind(&writer::print, &w, std::placeholders::_1)] >> '}'); } { // example using C++0x lambda expression char const *first = "{55}", *last = first + std::strlen(first); parse(first, last, lit('{')[[&](unused_type, unused_type, unused_type){w.do_nothing();}] >> int_[[&](int i, unused_type, unused_type){w.print(i);}] >> '}'); } return 0; } //11 //22 //33 //44 //55