#include <iostream>
#include <vector>
using namespace std;

template <typename T, typename M>
M membersum(vector<T> array, M (T::*mptr)) {
	M sum = 0;
	for (int i=0; i<array.size(); i++) {
		sum += (array[i].*mptr);
	}
	return sum;
}

struct Point {
	Point(int x, int y, float z): x(x), y(y), z(z) {}
	int x;
	int y;
	float z;
};

int main() {
	vector<Point> points;
	points.push_back(Point(1,2,3.8));
	points.push_back(Point(1,2,4.5));
	points.push_back(Point(1,2,1.7));
	// your code goes here
	cout << "sum x: " << membersum(points, &Point::x) << endl;
	cout << "sum y: " << membersum(points, &Point::y) << endl;
	cout << "sum z: " << membersum(points, &Point::z) << endl;
	return 0;
}