/******************************************************************************/ /* */ /* FILE: october.cpp */ /* */ /* This function object is missing in the standard */ /* =============================================== */ /* */ /* Compiled and tested with Visual C++ V6.0 */ /* */ /* V1.00 13-OCT-2002 P. Tellenbach http://www.heimetli.ch/ */ /* */ /******************************************************************************/ #include <iostream> #include <algorithm> #include <functional> using namespace std ; template< class Predicate, class First, class Second > class unary_evaluator : public unary_function< typename First::argument_type, typename Predicate::result_type > { public: unary_evaluator( Predicate pred, First fi, Second se ) : predicate( pred ), first( fi ), second( se ) { } typename Predicate::result_type operator()( typename First::argument_type &arg ) { return predicate( first(arg), second(arg) ) ; } private: Predicate predicate ; First first ; Second second ; } ; template< class Predicate, class First, class Second > unary_evaluator<Predicate,First,Second> eval( Predicate pred, First fi, Second se ) { return unary_evaluator<Predicate,First,Second>( pred, fi, se ) ; } int main() { string s( "Hexylazlo Aw-Borlady #!\n" ) ; remove_copy_if( s.begin(), s.end(), ostream_iterator<char>(cout), eval( logical_and<bool>(), eval( logical_and<char>(), eval( logical_and<char>(), bind1st(not_equal_to<char>(),'!'), bind1st(not_equal_to<char>(),'H') ), eval( logical_and<char>(), bind1st(not_equal_to<char>(),' '), bind1st(not_equal_to<char>(),'\n') ) ), eval( logical_or<char>(), bind1st(greater<char>(),'d'), bind1st(less<char>(),'w') ) ) ) ; return 0 ; }
Update 18. October 2022
The include for iterator was missing. No other changes were necessary.
/******************************************************************************/ /* */ /* FILE: october.cpp */ /* */ /* This function object is missing in the standard */ /* =============================================== */ /* */ /* Compiled and tested with Visual C++ V6.0 */ /* */ /* V1.00 13-OCT-2002 P. Tellenbach http://www.heimetli.ch/ */ /* */ /* Compiled and tested with g++ 11.2.0 */ /* */ /* V1.10 18-OCT-2022 P. Tellenbach https://www.heimetli.ch/ */ /* */ /******************************************************************************/ #include <iostream> #include <algorithm> #include <functional> #include <iterator> using namespace std ; template< class Predicate, class First, class Second > class unary_evaluator : public unary_function< typename First::argument_type, typename Predicate::result_type > { public: unary_evaluator( Predicate pred, First fi, Second se ) : predicate( pred ), first( fi ), second( se ) { } typename Predicate::result_type operator()( typename First::argument_type &arg ) { return predicate( first(arg), second(arg) ) ; } private: Predicate predicate ; First first ; Second second ; } ; template< class Predicate, class First, class Second > unary_evaluator<Predicate,First,Second> eval( Predicate pred, First fi, Second se ) { return unary_evaluator<Predicate,First,Second>( pred, fi, se ) ; } int main() { string s( "Hexylazlo Aw-Borlady #!\n" ) ; remove_copy_if( s.begin(), s.end(), ostream_iterator<char>(cout), eval( logical_and<bool>(), eval( logical_and<char>(), eval( logical_and<char>(), bind1st(not_equal_to<char>(),'!'), bind1st(not_equal_to<char>(),'H') ), eval( logical_and<char>(), bind1st(not_equal_to<char>(),' '), bind1st(not_equal_to<char>(),'\n') ) ), eval( logical_or<char>(), bind1st(greater<char>(),'d'), bind1st(less<char>(),'w') ) ) ) ; return 0 ; }