struct A1 {
void func() { std::cout << "A1" << std::endl; }
};

struct A2 {
void func() { std::cout << "A2" << std::endl; }
};

struct B {
A1 a1;
A2 a2;
void* operator[](int i) {
if (i == 0) return &a1;
else return &a2;
}
};

int main()
{
B b;
reinterpret_cast<A1*>(b[0])->func();
reinterpret_cast<A2*>(b[1])->func();
}