#include <iostream>
#include <string>
using namespace std;
enum DataType {
Int,
Float,
String,
};
struct Info {
DataType typ;
};
struct Data {
template<typename T> T read(Info i)const { return T(); }
};
void write(int) { cout << "INT" << endl; }
void write(float) { cout << "FLOAT" << endl; }
void write(string) { cout << "STRING" << endl; }
template<class T> void perform(const Info& i, const Data& d){
T value = d.read<T>(i);
write(value);
}
template<int N, class Head, class... Tail>
struct Dispatch {
static void dispatch(const Info& i, const Data& d) {
if (i.typ == N)
perform<Head>(i, d);
else
Dispatch<N+1, Tail...>::dispatch(i, d);
}
};
template<int N, class Last>
struct Dispatch<N, Last> {
static void dispatch(const Info& i, const Data& d) {
if (i.typ == N)
perform<Last>(i, d);
}
};
void run(const Info& i, const Data& d) {
Dispatch<0, int, float, string>::dispatch(i, d);
}
int main() {
Data d1;
Info i1{ Float };
run(i1, d1);
Info i2{ String };
run(i2, d1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gRGF0YVR5cGUgewoJSW50LAoJRmxvYXQsCglTdHJpbmcsCn07CnN0cnVjdCBJbmZvIHsKCURhdGFUeXBlIHR5cDsKfTsKc3RydWN0IERhdGEgewoJdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCByZWFkKEluZm8gaSljb25zdCB7IHJldHVybiBUKCk7IH0KfTsKCnZvaWQgd3JpdGUoaW50KSB7IGNvdXQgPDwgIklOVCIgPDwgZW5kbDsgfQp2b2lkIHdyaXRlKGZsb2F0KSB7IGNvdXQgPDwgIkZMT0FUIiA8PCBlbmRsOyB9CnZvaWQgd3JpdGUoc3RyaW5nKSB7IGNvdXQgPDwgIlNUUklORyIgPDwgZW5kbDsgfQoKdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBwZXJmb3JtKGNvbnN0IEluZm8mIGksIGNvbnN0IERhdGEmIGQpewoJVCB2YWx1ZSA9IGQucmVhZDxUPihpKTsKCXdyaXRlKHZhbHVlKTsKfQoKdGVtcGxhdGU8aW50IE4sIGNsYXNzIEhlYWQsIGNsYXNzLi4uIFRhaWw+CnN0cnVjdCBEaXNwYXRjaCB7CglzdGF0aWMgdm9pZCBkaXNwYXRjaChjb25zdCBJbmZvJiBpLCBjb25zdCBEYXRhJiBkKSB7CgkJaWYgKGkudHlwID09IE4pCgkJCXBlcmZvcm08SGVhZD4oaSwgZCk7CgkJZWxzZQoJCQlEaXNwYXRjaDxOKzEsIFRhaWwuLi4+OjpkaXNwYXRjaChpLCBkKTsKCX0KfTsKCnRlbXBsYXRlPGludCBOLCBjbGFzcyBMYXN0PgpzdHJ1Y3QgRGlzcGF0Y2g8TiwgTGFzdD4gewoJc3RhdGljIHZvaWQgZGlzcGF0Y2goY29uc3QgSW5mbyYgaSwgY29uc3QgRGF0YSYgZCkgewoJCWlmIChpLnR5cCA9PSBOKQoJCQlwZXJmb3JtPExhc3Q+KGksIGQpOwoJfQp9OwoKdm9pZCBydW4oY29uc3QgSW5mbyYgaSwgY29uc3QgRGF0YSYgZCkgewoJRGlzcGF0Y2g8MCwgaW50LCBmbG9hdCwgc3RyaW5nPjo6ZGlzcGF0Y2goaSwgZCk7Cn0KCmludCBtYWluKCkgewoJRGF0YSBkMTsKCUluZm8gaTF7IEZsb2F0IH07CglydW4oaTEsIGQxKTsKCUluZm8gaTJ7IFN0cmluZyB9OwoJcnVuKGkyLCBkMSk7Cn0=