template<typename T> T add(T t1, T t2) { return t1 + t2; }
template<typename T> struct type{ }; template<> struct type<float>{ using type_t = float; }; template<> struct type<double>{ using type_t = double; }; template <typename T> typename type<T>::type_t add(T t1, T t2) { return t1 + t2; }