#include <iostream>
#include <utility>
#include <typeinfo>
struct A{};
struct B{};
struct X
{
double f(A&);
int* f(B&);
};
double X::f(A&) { return 0; }
int* X::f(B&) { return 0; }
template<typename T, typename R = decltype(std::declval<X>().f(std::declval<T&>()))>
R ff(T& arg)
{
std::cout << typeid(R).name() << std::endl;
X x;
R r = x.f(arg); // preferably if I can create local variables of type R here
return r;
}
int main()
{
A a; ff(a);
B b; ff(b);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR5cGVpbmZvPgoKc3RydWN0IEF7fTsKc3RydWN0IEJ7fTsKCnN0cnVjdCBYCnsKICAgIGRvdWJsZSBmKEEmKTsKICAgIGludCogZihCJik7Cn07Cgpkb3VibGUgWDo6ZihBJikgeyByZXR1cm4gMDsgfQppbnQqIFg6OmYoQiYpIHsgcmV0dXJuIDA7IH0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8WD4oKS5mKHN0ZDo6ZGVjbHZhbDxUJj4oKSkpPgpSIGZmKFQmIGFyZykKewoJc3RkOjpjb3V0IDw8IHR5cGVpZChSKS5uYW1lKCkgPDwgc3RkOjplbmRsOwogICAgWCB4OwogICAgUiByID0geC5mKGFyZyk7IC8vIHByZWZlcmFibHkgaWYgSSBjYW4gY3JlYXRlIGxvY2FsIHZhcmlhYmxlcyBvZiB0eXBlIFIgaGVyZQogICAgcmV0dXJuIHI7Cn0KCmludCBtYWluKCkKewogICAgQSBhOyBmZihhKTsKICAgIEIgYjsgZmYoYik7CiAgICByZXR1cm4gMDsKfQ==