#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’
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIG91dCwgY2xhc3MgaW4+Cm91dCogZm9vKGluKik7Cgp0ZW1wbGF0ZSA8Pgpkb3VibGUqIGZvbzxkb3VibGUsIHNpemVfdD4oc2l6ZV90KiBpKQp7CglyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxkb3VibGUqPihpKTsKfQoKaW50IG1haW4oKSB7CgkKCXNpemVfdCBpID0gMDsKCQoJc3RkOjpjb3V0IDw8ICpmb288ZG91YmxlPigmaSkgPDwgc3RkOjplbmRsOyAvLyBPSwoJLy8gc3RkOjpjb3V0IDw8ICpmb28oJmkpIDw8IHN0ZDo6ZW5kbDsgLy8gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uL3N1YnN0aXR1dGlvbiBmYWlsZWQ6IGNvdWxkbid0IGRlZHVjZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIg4oCYb3V04oCZCn0=