#include <iostream>
template <typename DT, int DV, void (DT::*DF)(int)>
struct Description
{
typedef DT T; // OK
static const int V = DV; // OK
static void (T::*F)(int);
};
template <typename DT, int DV, void (DT::*DF)(int)>
void (DT::* Description<DT, DV, DF>::F)(int) = DF;
struct TestClass
{
void TestFunc( int x ) { std::cout << "Value is: " << x << std::endl; }
};
int main()
{
typedef Description<TestClass, 5, &TestClass::TestFunc> TCD;
TestClass t;
(t.*(TCD::F))(5);
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRFQsIGludCBEViwgdm9pZCAoRFQ6OipERikoaW50KT4KICAgIHN0cnVjdCBEZXNjcmlwdGlvbgogICAgewogICAgICAgIHR5cGVkZWYgRFQgVDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0sKICAgICAgICBzdGF0aWMgY29uc3QgaW50IFYgPSBEVjsgICAgICAgICAgICAgIC8vIE9LCiAgICAgICAgc3RhdGljIHZvaWQgKFQ6OipGKShpbnQpOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRFQsIGludCBEViwgdm9pZCAoRFQ6OipERikoaW50KT4KICAgIHZvaWQgKERUOjoqIERlc2NyaXB0aW9uPERULCBEViwgREY+OjpGKShpbnQpID0gREY7CgogICAgc3RydWN0IFRlc3RDbGFzcwogICAgewogICAgICAgIHZvaWQgVGVzdEZ1bmMoIGludCB4ICkgeyBzdGQ6OmNvdXQgPDwgIlZhbHVlIGlzOiAiIDw8IHggPDwgc3RkOjplbmRsOyB9CiAgICB9OwoKICAgIGludCBtYWluKCkKICAgIHsKICAgICAgICB0eXBlZGVmIERlc2NyaXB0aW9uPFRlc3RDbGFzcywgNSwgJlRlc3RDbGFzczo6VGVzdEZ1bmM+IFRDRDsKCiAgICAgICAgVGVzdENsYXNzIHQ7CiAgICAgICAgKHQuKihUQ0Q6OkYpKSg1KTsKICAgIH0=