//: C06:PtrFun1.cpp // Using ptr_fun() with a unary function. #include <algorithm> #include <cmath> #include <functional> #include <iostream> #include <iterator> #include <vector> using namespace std; int d[] = { 123, 94, 10, 314, 315 }; const int DSZ = sizeof d / sizeof *d; bool isEven(int x) { return x % 2 == 0; } int main() { vector<bool> vb; transform(d, d + DSZ, back_inserter(vb), not1(ptr_fun(isEven))); copy(vb.begin(), vb.end(), ostream_iterator<bool>(cout, " ")); cout << endl; // Output: 1 0 0 0 1 } ///:~
Listado 7.19. C06/PtrFun1.cpp
//: C06:PtrFun2.cpp {-edg} // Using ptr_fun() for a binary function. #include <algorithm> #include <cmath> #include <functional> #include <iostream> #include <iterator> #include <vector> using namespace std; double d[] = { 01.23, 91.370, 56.661, 023.230, 19.959, 1.0, 3.14159 }; const int DSZ = sizeof d / sizeof *d; int main() { vector<double> vd; transform(d, d + DSZ, back_inserter(vd), bind2nd(ptr_fun<double, double, double>(pow), 2.0)); copy(vd.begin(), vd.end(), ostream_iterator<double>(cout, " ")); cout << endl; } ///:~
Listado 7.20. C06/PtrFun2.cpp
//: C06:MemFun1.cpp // Applying pointers to member functions. #include <algorithm> #include <functional> #include <iostream> #include <vector> #include "../purge.h" using namespace std; class Shape { public: virtual void draw() = 0; virtual ~Shape() {} }; class Circle : public Shape { public: virtual void draw() { cout << "Circle::Draw()" << endl; } ~Circle() { cout << "Circle::~Circle()" << endl; } }; class Square : public Shape { public: virtual void draw() { cout << "Square::Draw()" << endl; } ~Square() { cout << "Square::~Square()" << endl; } }; int main() { vector<Shape*> vs; vs.push_back(new Circle); vs.push_back(new Square); for_each(vs.begin(), vs.end(), mem_fun(&Shape::draw)); purge(vs); } ///:~
Listado 7.21. C06/MemFun1.cpp
//: C06:MemFun2.cpp // Calling member functions through an object reference. #include <algorithm> #include <functional> #include <iostream> #include <iterator> #include <vector> using namespace std; class Angle { int degrees; public: Angle(int deg) : degrees(deg) {} int mul(int times) { return degrees *= times; } }; int main() { vector<Angle> va; for(int i = 0; i < 50; i += 10) va.push_back(Angle(i)); int x[] = { 1, 2, 3, 4, 5 }; transform(va.begin(), va.end(), x, ostream_iterator<int>(cout, " "), mem_fun_ref(&Angle::mul)); cout << endl; // Output: 0 20 60 120 200 } ///:~
Listado 7.22. C06/MemFun2.cpp
//: C06:FindBlanks.cpp // Demonstrates mem_fun_ref() with string::empty(). #include <algorithm> #include <cassert> #include <cstddef> #include <fstream> #include <functional> #include <string> #include <vector> #include "../require.h" using namespace std; typedef vector<string>::iterator LSI; int main(int argc, char* argv[]) { char* fname = "FindBlanks.cpp"; if(argc > 1) fname = argv[1]; ifstream in(fname); assure(in, fname); vector<string> vs; string s; while(getline(in, s)) vs.push_back(s); vector<string> cpy = vs; // For testing LSI lsi = find_if(vs.begin(), vs.end(), mem_fun_ref(&string::empty)); while(lsi != vs.end()) { *lsi = "A BLANK LINE"; lsi = find_if(vs.begin(), vs.end(), mem_fun_ref(&string::empty)); } for(size_t i = 0; i < cpy.size(); i++) if(cpy[i].size() == 0) assert(vs[i] == "A BLANK LINE"); else assert(vs[i] != "A BLANK LINE"); } ///:~
Listado 7.23. C06/FindBlanks.cpp