#include <iostream>
template <typename T1, typename T2>
struct offset_of_impl {
static T2 object;
static constexpr uintptr_t offset(T1 T2::*member) {
return uintptr_t(&(offset_of_impl<T1, T2>::object.*member)) -
uintptr_t(&offset_of_impl<T1, T2>::object);
}
};
template <typename T1, typename T2>
inline constexpr uintptr_t offset_of(T1 T2::*member) {
return offset_of_impl<T1, T2>::offset(member);
}
struct vec2 { float x, y; };
struct vec3 : vec2 { float z; };
struct vec4 : vec3 { float w; };
enum { Value = offset_of(&vec4::y) };
int main() {
std::cout << Value << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4Kc3RydWN0IG9mZnNldF9vZl9pbXBsIHsKICAgIHN0YXRpYyBUMiBvYmplY3Q7CgogICAgc3RhdGljIGNvbnN0ZXhwciB1aW50cHRyX3Qgb2Zmc2V0KFQxIFQyOjoqbWVtYmVyKSB7CiAgICAgICAgcmV0dXJuIHVpbnRwdHJfdCgmKG9mZnNldF9vZl9pbXBsPFQxLCBUMj46Om9iamVjdC4qbWVtYmVyKSkgLQogICAgICAgICAgICAgICB1aW50cHRyX3QoJm9mZnNldF9vZl9pbXBsPFQxLCBUMj46Om9iamVjdCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgppbmxpbmUgY29uc3RleHByIHVpbnRwdHJfdCBvZmZzZXRfb2YoVDEgVDI6OiptZW1iZXIpIHsKICAgIHJldHVybiBvZmZzZXRfb2ZfaW1wbDxUMSwgVDI+OjpvZmZzZXQobWVtYmVyKTsKfQoKc3RydWN0IHZlYzIgeyBmbG9hdCB4LCB5OyB9OwpzdHJ1Y3QgdmVjMyA6IHZlYzIgeyBmbG9hdCB6OyB9OwpzdHJ1Y3QgdmVjNCA6IHZlYzMgeyBmbG9hdCB3OyB9OwoKZW51bSB7IFZhbHVlID0gb2Zmc2V0X29mKCZ2ZWM0Ojp5KSB9OwoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgVmFsdWUgPDwgIlxuIjsKCXJldHVybiAwOwp9