#include <vector>
class Hoge
{
public:
int x, y;
bool flag;
class Statics
{
public:
Statics()
{
push_back_member(&Hoge::x);
push_back_member(&Hoge::y);
push_back_member(&Hoge::flag);
}
template<typename T> void push_back_member(T (Hoge::*p)) { members.push_back(reinterpret_cast<char Hoge::*>(p)); }
template<typename T> T (Hoge::*nth_member(int n) const) { return reinterpret_cast<T Hoge::*>(members[n]); }
private:
std::vector<char Hoge::*> members;
} static statics;
};
Hoge::Statics Hoge::statics;
#include <cassert>
int main()
{
assert(Hoge::statics.nth_member<int>(0) == &Hoge::x);
assert(Hoge::statics.nth_member<int>(1) == &Hoge::y);
assert(Hoge::statics.nth_member<bool>(2) == &Hoge::flag);
}