#include <iostream>
#include <type_traits> 
 
template<int I,class T> 
struct static_case { 
	static constexpr int value = I; 
	using type = T; 
}; 


template<int I, class DefaultType, class Case1, class... OtherCases> 
struct static_switch{ 
	using type = typename std::conditional< I==Case1::value ,  
					typename Case1::type, 
					typename static_switch<I,DefaultType,OtherCases...>::type 
				     >::type; 
}; 

 
template<int I, class DefaultType, class LastCase> 
struct static_switch<I,DefaultType,LastCase> { 
	using type = typename std::conditional< I==LastCase::value ,  
					typename LastCase::type, 
					DefaultType 
				     >::type; 
}; 


template<class T>
typename static_switch<sizeof(T)
            ,int // default case
            ,static_case<sizeof(char),char>
            ,static_case<sizeof(short),short>
            ,static_case<sizeof(long),long>
            ,static_case<sizeof(long long),long long>
            >::type foo(T bar){ return reinterpret_cast<decltype(foo(bar))&>(bar);}


auto val = foo(13.0);
static_assert(std::is_same<long long, decltype(val)>::value,"Not converted to long long!");

using namespace std;

int main() {
	// your code goes here
	return 0;
}