#include <iostream>
#include <type_traits>
struct C{
int f()
{
return 5;
}
} c;
template<typename T, T t, typename S, S* s> void callCf()
{
std::cout << (s->*t)();
}
int main()
{
using tC = std::remove_reference_t<decltype(c)>;
callCf<decltype(&tC::f), &tC::f, tC, &c>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgQ3sKICAgIGludCBmKCkKICAgIHsKICAgICAgICByZXR1cm4gNTsKICAgIH0KfSBjOwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgVCB0LCB0eXBlbmFtZSBTLCBTKiBzPiB2b2lkIGNhbGxDZigpCnsKCXN0ZDo6Y291dCA8PCAocy0+KnQpKCk7Cn0KCmludCBtYWluKCkKewoJdXNpbmcgdEMgPSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxkZWNsdHlwZShjKT47CgljYWxsQ2Y8ZGVjbHR5cGUoJnRDOjpmKSwgJnRDOjpmLCB0QywgJmM+KCk7CglyZXR1cm4gMDsKfQ==