#include <iostream>
// in the normal case, just the identity
template<class T>
struct item_return{ typedef T type; };
template<class T>
typename item_return<T>::type foo(){ return T(); }
template<>
struct item_return<float>{ typedef int type; };
template<>
int foo<float>(){ return 42; }
// might want to stick to the following
// so you only need to update the return-type in one place
// namely, the `item_return` specialization
//template<>
//item_return<float>::type foo<float>(){ ... }
// note: No `typename` needed, because `float` is not a dependent type
int main(){
std::cout << "out = " << foo();
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKCi8vIGluIHRoZSBub3JtYWwgY2FzZSwganVzdCB0aGUgaWRlbnRpdHkKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IGl0ZW1fcmV0dXJueyB0eXBlZGVmIFQgdHlwZTsgfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnR5cGVuYW1lIGl0ZW1fcmV0dXJuPFQ+Ojp0eXBlIGZvbygpeyByZXR1cm4gVCgpOyB9Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBpdGVtX3JldHVybjxmbG9hdD57IHR5cGVkZWYgaW50IHR5cGU7IH07Cgp0ZW1wbGF0ZTw+CmludCBmb288ZmxvYXQ+KCl7IHJldHVybiA0MjsgfQoKLy8gbWlnaHQgd2FudCB0byBzdGljayB0byB0aGUgZm9sbG93aW5nCi8vIHNvIHlvdSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSByZXR1cm4tdHlwZSBpbiBvbmUgcGxhY2UKLy8gbmFtZWx5LCB0aGUgYGl0ZW1fcmV0dXJuYCBzcGVjaWFsaXphdGlvbgovL3RlbXBsYXRlPD4KLy9pdGVtX3JldHVybjxmbG9hdD46OnR5cGUgZm9vPGZsb2F0PigpeyAuLi4gfQovLyBub3RlOiBObyBgdHlwZW5hbWVgIG5lZWRlZCwgYmVjYXVzZSBgZmxvYXRgIGlzIG5vdCBhIGRlcGVuZGVudCB0eXBlCgppbnQgbWFpbigpewoJc3RkOjpjb3V0IDw8ICJvdXQgPSAiIDw8IGZvbygpOwp9