#include <iostream>

template <class out, class in>
out* foo(in*);

template <>
double* foo<double, size_t>(size_t* i)
{
	return reinterpret_cast<double*>(i);
}

int main() {
	
	size_t i = 0;
	
	std::cout << *foo<double>(&i) << std::endl; // OK
	// std::cout << *foo(&i) << std::endl; // template argument deduction/substitution failed: couldn't deduce template parameter ‘out’
}