59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
|
//wrapped1.cpp -- using a function wrapper as an argument
|
||
|
#include <iostream>
|
||
|
#include <math.h>
|
||
|
#include <functional>
|
||
|
using namespace std;
|
||
|
|
||
|
template <typename T, typename F>
|
||
|
T use_f(T v, F f)
|
||
|
{
|
||
|
static int count = 0;
|
||
|
count++;
|
||
|
cout << " use_f count = " << count << ", &count = " << &count << endl;
|
||
|
return f(v);
|
||
|
}
|
||
|
|
||
|
class Fp
|
||
|
{
|
||
|
private:
|
||
|
double z_;
|
||
|
public:
|
||
|
Fp(double z = 1.0) : z_(z) {}
|
||
|
double operator()(double p) { return z_*p; }
|
||
|
};
|
||
|
class Fq
|
||
|
{
|
||
|
private:
|
||
|
double z_;
|
||
|
public:
|
||
|
Fq(double z = 1.0) : z_(z) {}
|
||
|
double operator()(double q) { return z_+ q; }
|
||
|
};
|
||
|
|
||
|
double dub(double x) {return 2.0*x;}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
double y = 1.21;
|
||
|
function<double(double)> ef1 = dub;
|
||
|
function<double(double)> ef2 = sqrt;
|
||
|
function<double(double)> ef3 = Fq(10.0);
|
||
|
function<double(double)> ef4 = Fp(10.0);
|
||
|
function<double(double)> ef5 = [](double u) {return u*u;};
|
||
|
function<double(double)> ef6 = [](double u) {return u+u/2.0;};
|
||
|
cout << "Function pointer dub:\n";
|
||
|
cout << " " << use_f(y, ef1) << endl;
|
||
|
cout << "Function pointer sqrt:\n";
|
||
|
cout << " " << use_f(y, ef2) << endl;
|
||
|
cout << "Function object Fp:\n";
|
||
|
cout << " " << use_f(y, ef3) << endl;
|
||
|
cout << "Function object Fq:\n";
|
||
|
cout << " " << use_f(y, ef4) << endl;
|
||
|
cout << "Lambda expression 1:\n";
|
||
|
cout << " " << use_f(y, ef5) << endl;
|
||
|
cout << "Lambda expression 2:\n";
|
||
|
cout << " " << use_f(y,ef6) << endl;
|
||
|
// cin.get();
|
||
|
return 0;
|
||
|
}
|