/*============================================================================= Copyright (c) 2001-2010 Hartmut Kaiser Copyright (c) 2001-2010 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include #include #include #include #include #include // Presented are various ways to attach semantic actions // * Using plain function pointer // * Using simple function object // * Using boost.bind // * Using boost.lambda using boost::spirit::unused_type; //[karma_tutorial_semantic_action_functions namespace client { namespace karma = boost::spirit::karma; // A plain function void read_function(int& i) { i = 42; } // A member function struct reader { void print(int& i) const { i = 42; } }; // A function object struct read_action { void operator()(int& i, unused_type, unused_type) const { i = 42; } }; } //] /////////////////////////////////////////////////////////////////////////////// int main() { using boost::spirit::karma::int_; using boost::spirit::karma::generate; using client::read_function; using client::reader; using client::read_action; { // example using plain functions using namespace boost::spirit; std::string generated; std::back_insert_iterator outiter(generated); //[karma_tutorial_attach_actions1 generate(outiter, '{' << int_[&read_function] << '}'); //] std::cout << "Simple function: " << generated << std::endl; } { // example using simple function object using namespace boost::spirit; std::string generated; std::back_insert_iterator outiter(generated); //[karma_tutorial_attach_actions2 generate(outiter, '{' << int_[read_action()] << '}'); //] std::cout << "Simple function object: " << generated << std::endl; } { // example using plain function with boost.bind using namespace boost::placeholders; std::string generated; std::back_insert_iterator outiter(generated); //[karma_tutorial_attach_actions3 generate(outiter, '{' << int_[boost::bind(&read_function, _1)] << '}'); //] std::cout << "Simple function with Boost.Bind: " << generated << std::endl; } { // example using member function with boost.bind using namespace boost::placeholders; std::string generated; std::back_insert_iterator outiter(generated); //[karma_tutorial_attach_actions4 reader r; generate(outiter, '{' << int_[boost::bind(&reader::print, &r, _1)] << '}'); //] std::cout << "Member function: " << generated << std::endl; } { // example using boost.lambda namespace lambda = boost::lambda; using namespace boost::spirit; std::string generated; std::back_insert_iterator outiter(generated); //[karma_tutorial_attach_actions5 std::stringstream strm("42"); generate(outiter, '{' << int_[strm >> lambda::_1] << '}'); //] std::cout << "Boost.Lambda: " << generated << std::endl; } return 0; }