    #include <iostream>

    template <typename T> struct identity { typedef T type; };

    template<typename DT, int DV, void (DT::*DF)(int)>
    struct Description
    {
        typedef DT T;                         // OK
        static const int V = DV;              // OK
    };

    template <typename DT, int DV, void (DT::*DF)(int)>
    typename identity<void (DT::*)(int)>::type function(Description<DT, DV, DF>) {
      return DF;
    }

    struct TestClass
    {
        void TestFunc( int x ) { std::cout << "Value is: " << x << std::endl; }
    };

    int main()
    {
        typedef Description<TestClass, 5, &TestClass::TestFunc> TCD;
        TCD tcd;

        TestClass t;
        (t.*function(tcd))(5);
    }