#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);
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlkZW50aXR5IHsgdHlwZWRlZiBUIHR5cGU7IH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgRFQsIGludCBEViwgdm9pZCAoRFQ6OipERikoaW50KT4KICAgIHN0cnVjdCBEZXNjcmlwdGlvbgogICAgewogICAgICAgIHR5cGVkZWYgRFQgVDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0sKICAgICAgICBzdGF0aWMgY29uc3QgaW50IFYgPSBEVjsgICAgICAgICAgICAgIC8vIE9LCiAgICB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEVCwgaW50IERWLCB2b2lkIChEVDo6KkRGKShpbnQpPgogICAgdHlwZW5hbWUgaWRlbnRpdHk8dm9pZCAoRFQ6OiopKGludCk+Ojp0eXBlIGZ1bmN0aW9uKERlc2NyaXB0aW9uPERULCBEViwgREY+KSB7CiAgICAgIHJldHVybiBERjsKICAgIH0KCiAgICBzdHJ1Y3QgVGVzdENsYXNzCiAgICB7CiAgICAgICAgdm9pZCBUZXN0RnVuYyggaW50IHggKSB7IHN0ZDo6Y291dCA8PCAiVmFsdWUgaXM6ICIgPDwgeCA8PCBzdGQ6OmVuZGw7IH0KICAgIH07CgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIHR5cGVkZWYgRGVzY3JpcHRpb248VGVzdENsYXNzLCA1LCAmVGVzdENsYXNzOjpUZXN0RnVuYz4gVENEOwogICAgICAgIFRDRCB0Y2Q7CgogICAgICAgIFRlc3RDbGFzcyB0OwogICAgICAgICh0LipmdW5jdGlvbih0Y2QpKSg1KTsKICAgIH0=