#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);
}