#include <iostream>
template <typename fT>
struct return_type;
template <typename R, typename ...Args>
struct return_type<R(*)(Args...)>
{
using type = R;
};
struct A
{
template <class T>
using X = void();
template <class T>
X<T> x;
};
template <typename T>
auto A::x() -> typename return_type< typename std::add_pointer<X<T>>::type >::type
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
A a;
a.x<void>();
a.x<int>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIGZUPgpzdHJ1Y3QgcmV0dXJuX3R5cGU7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgLi4uQXJncz4Kc3RydWN0IHJldHVybl90eXBlPFIoKikoQXJncy4uLik+CnsKICAgIHVzaW5nIHR5cGUgPSBSOwp9OwoKc3RydWN0IEEKewogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICB1c2luZyBYID0gdm9pZCgpOyAgICAKICAgIAogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICBYPFQ+IHg7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBBOjp4KCkgLT4gdHlwZW5hbWUgcmV0dXJuX3R5cGU8IHR5cGVuYW1lIHN0ZDo6YWRkX3BvaW50ZXI8WDxUPj46OnR5cGUgPjo6dHlwZQp7IAogICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgIEEgYTsKICAgIAogICAgYS54PHZvaWQ+KCk7CiAgICBhLng8aW50PigpOwp9