#include <iostream>

template<typename X>
struct S
{
    typedef int func_t(X value);
    
    template<typename F>
    struct Extract;
    template<typename F>
    struct Extract<int(F)>
    {
        typedef F type;
    };    
    typedef typename Extract<func_t>::type xtype;
};

void x() { std::cout << "x" << std::endl; }

int main()
{
    S<void() volatile>::xtype z = &x;
    z();
}