Solution with Boost.Function
class A { public: double sum(double a, double b); double max(double a, double b); } template <typename T> class B { std::vector<T> data; public: double sum (double a, double b); double max (double a, double b); double average(boost::function<double (T*, double, double) MyFunction, double a, dobule b) { double sum = 0; int n = data.size(); for ( int i = 0; i < n; i++) sum = sum + MyFunction(&data[i], a, b) return sum / n; } }
Example
boost::function<double (A*, a, b)> MyFunction = &A::max; average(MyFunction, a, b);
Working example ::
#include <cmath> using namespace std; #include <vector> #include <boost/function.hpp> #define CallTemplate(returnvalue, FINClass) boost::function<returnvalue (FINClass*, double, double)> class zc { double n; double r; double p; public: zc(double nn, double rr, double pp):n(nn), r(rr), p(pp) {} double pv(double t, double v) { return p/ pow ( ( 1 + r + v), ( n - t) );} double d(double t, double v) { return (n - t); } double c(double t, double v) { return (n - t)*(n - t)+(n - t); } }; template <typename T> class Master { public: Master(){} std::vector<T> data; double pv(double t, double v) {CallTemplate(double, T) f = &T::pv; return sum(f, t, v);} double d(double t, double v) {CallTemplate(double, T) f = &T::d; return weightedAverage(f, t, v);} double c(double t, double v) {CallTemplate(double, T) f = &T::c; return weightedAverage(f, t, v);} double sum(CallTemplate(double, T) MyFunction, double t, double v) { double sum = 0; for( int i = 0, n = data.size(); i < n; i++) sum = sum + MyFunction(&data[i], t, v); return sum; } double weightedAverage(CallTemplate(double, T) MyFunction, double t, double v) { double sum = 0; double weight = 0; double buf =0; for( int i = 0, n = data.size(); i < n; i++) { buf = data[i].pv(t, v); sum = sum + buf; weight = weight + MyFunction(&data[i], t, v) * buf; } return weight/sum; } }; int main() { Master<zc> A; for (int i = 1; i < 10; i++) A.data.push_back(zc(i, 0.1, 100)); A.data.push_back(zc(10, 0.1, 1100)); cout << A.pv(0, 0) << endl; cout << Ad(0, 0) << endl; cout << Ac(0, 0) << endl; return 0; }