#include <iostream>
#include <vector>
#include <numeric>
template<typename Iter, typename T>
double mean(Iter begin, Iter end, double (T::*member))
{
size_t n = 0;
double s = std::accumulate(begin, end, 0.0,
[&](double acc, const T &t){ ++n; return acc + t.*member; }
);
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXIsIHR5cGVuYW1lIFQ+CmRvdWJsZSBtZWFuKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kLCBkb3VibGUgKFQ6OiptZW1iZXIpKQp7CglzaXplX3QgbiA9IDA7Cglkb3VibGUgcyA9IHN0ZDo6YWNjdW11bGF0ZShiZWdpbiwgZW5kLCAwLjAsCgkJWyZdKGRvdWJsZSBhY2MsIGNvbnN0IFQgJnQpeyArK247IHJldHVybiBhY2MgKyB0LiptZW1iZXI7IH0KCSk7CglyZXR1cm4gcyAvIG47Cn0KCnN0cnVjdCBUCnsKICAgIGRvdWJsZSBhOwogICAgZG91YmxlIGI7Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPFQ+IHYgPSB7ezEuMCwgMi4wfSwgezMuMCwgNC4wfSwgezUuMCwgNi4wfX07CglzdGQ6OmNvdXQgPDwgbWVhbih2LmJlZ2luKCksIHYuZW5kKCksICZUOjphKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgbWVhbih2LmJlZ2luKCksIHYuZW5kKCksICZUOjpiKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==