#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;
}