/*============================================================================= For Boost Bind: Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd. Copyright (c) 2001 David Abrahams Copyright (c) 2005 Peter Dimov For Boost Phoenix: Copyright (c) 2001-2010 Joel de Guzman Copyright (c) 2010 Thomas Heller For the example: Copyright (c) 2011 Paul Heil Copyright (c) 2015 John Fletcher 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) ==============================================================================*/ // bind_goose.cpp // This example is based on code by Paul Heil to be found here: // http://www.codeproject.com/Tips/248492/How-does-boost-phoenix-improve-boost-bind // // Show different ways of using boost bind and phoenix to handle deletion. // #include #include #include #include #include #include #include #include #include #include //////////////////////////////////////////// // Set up the list here //////////////////////////////////////////// std::vector< std::string > make_list() { std::vector< std::string > list; list.push_back( "duck" ); list.push_back( "duck" ); list.push_back( "goose" ); return list; } ////////////////////////////////////////////// // First example using standard library only ////////////////////////////////////////////// bool IsGoose( const std::string& s ) { return s == "goose"; } void delete_value1(std::vector< std::string > &list ) { list.erase( std::remove_if( list.begin(), list.end(), IsGoose ), list.end() ); } void out_string(const std::string &s) { std::cout << s << std::endl; } void show_list1( const std::vector< std::string > &list ) { std::for_each(list.begin(), list.end(), out_string); } ////////////////////////////////////////////// // Second example using boost bind ////////////////////////////////////////////// bool isValue(const std::string &s1, const std::string &s2) { return s1==s2; } void delete_value2(std::vector< std::string > &list, const std::string & value) { list.erase( std::remove_if( list.begin(), list.end(), boost::bind( isValue, // &isValue works as well. _1, // Boost.Bind placeholder boost::cref( value ) ) ), list.end() ); } /////////////////////////////////////////////////////// // Third example using boost phoenix for the comparison /////////////////////////////////////////////////////// namespace phx = boost::phoenix; using phx::placeholders::arg1; using phx::placeholders::arg2; void delete_value3(std::vector< std::string > &list, const std::string & value) { list.erase( std::remove_if( list.begin(), list.end(), // This needs header boost/phoenix/operator/comparison. // arg1 is a Boost.Phoenix placeholder. arg1 == phx::cref( value ) ), list.end() ); } ////////////////////////////////////////////////////////////// // Third example using boost phoenix for the algorithm as well ////////////////////////////////////////////////////////////// void delete_value4(std::vector< std::string > &list, const std::string & value) { // This need header boost/phoenix/stl/algorithm/transformation list.erase( phx::remove_if( arg1, arg2 ) ( list, arg1 == phx::cref( value ) ), list.end() ); } int main() { std::cout << "--------------------------------" << std::endl; std::cout << "Delete the goose examples." << std::endl; std::cout << "--------------------------------" << std::endl; std::string value = "goose"; std::vector< std::string > list1 = make_list(); delete_value1(list1); show_list1(list1); std::cout << "--------------------------------" << std::endl; std::vector< std::string > list2 = make_list(); delete_value2(list2,value); show_list1(list2); std::cout << "--------------------------------" << std::endl; std::vector< std::string > list3 = make_list(); delete_value3(list3,value); show_list1(list3); std::cout << "--------------------------------" << std::endl; std::vector< std::string > list4 = make_list(); delete_value4(list4,value); show_list1(list4); std::cout << "--------------------------------" << std::endl; return 0; }