template<typename T, typename U> foo(const T& t, type<U>) { }
template<typename T> inline foo(const T& t) { foo(t, type<int>()); }

foo(c); // U = int
foo(c, type<double>()); // U = double