Earlier quoted context omitted.
You can sort of do it so long as the return type is a template parameter. template T my_construct() { T result; return result; }
That's not polymorphism as that template parameter won't be deduced in any context and you will always have to explicitly instantiate the template.
edit: you get pseudo call-by-name as a bonus.