#include <iostream>
#include <vector>
template<typename Iter, typename T>
double mean(Iter begin, Iter end, double (T::*member))
{
double s = 0;
size_t n = 0;
while (begin != end)
{
s += (*begin++).*member;
++n;
}
return s / n;
}
struct T
{
double a;
double b;
};
int main() {
std::vector<T> v = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
std::cout << mean(v.begin(), v.end(), &T::a) << std::endl;
std::cout << mean(v.begin(), v.end(), &T::b) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgVD4KZG91YmxlIG1lYW4oSXRlciBiZWdpbiwgSXRlciBlbmQsIGRvdWJsZSAoVDo6Km1lbWJlcikpCnsKICAgIGRvdWJsZSBzID0gMDsKICAgIHNpemVfdCBuID0gMDsKICAgIHdoaWxlIChiZWdpbiAhPSBlbmQpCiAgICB7CiAgICAgICAgcyArPSAoKmJlZ2luKyspLiptZW1iZXI7CiAgICAgICAgKytuOwogICAgfQogICAgCiAgICByZXR1cm4gcyAvIG47Cn0KCnN0cnVjdCBUCnsKICAgIGRvdWJsZSBhOwogICAgZG91YmxlIGI7Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPFQ+IHYgPSB7ezEuMCwgMi4wfSwgezMuMCwgNC4wfSwgezUuMCwgNi4wfX07CglzdGQ6OmNvdXQgPDwgbWVhbih2LmJlZ2luKCksIHYuZW5kKCksICZUOjphKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgbWVhbih2LmJlZ2luKCksIHYuZW5kKCksICZUOjpiKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==