#include <iostream>
class Test
{
public:
void foo()
{
std::cout << 0 << std::endl;
}
template< int N >
void fooN()
{
std::cout << N << std::endl;
}
template< typename Fn >
void invoke( Fn&& fn )
{
(*this.*fn)();
}
};
int main( int args, char *argv[] )
{
Test test;
using Fn = decltype(&Test::fooN<1>);
test.invoke<Fn>( &Test::foo );
test.invoke<Fn>( &Test::fooN<1> );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgVGVzdAp7CnB1YmxpYzoKICAgIHZvaWQgZm9vKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgMCA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgdGVtcGxhdGU8IGludCBOID4KICAgIHZvaWQgZm9vTigpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IE4gPDwgc3RkOjplbmRsOwogICAgfQoKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBGbiA+CiAgICB2b2lkIGludm9rZSggRm4mJiBmbiApCiAgICB7CgogICAgICAgICgqdGhpcy4qZm4pKCk7CiAgICB9Cgp9OwoKCmludCBtYWluKCBpbnQgYXJncywgY2hhciAqYXJndltdICkKewogICAgVGVzdCB0ZXN0OwoKICAgIHVzaW5nIEZuID0gZGVjbHR5cGUoJlRlc3Q6OmZvb048MT4pOwoKICAgIHRlc3QuaW52b2tlPEZuPiggJlRlc3Q6OmZvbyApOwogICAgdGVzdC5pbnZva2U8Rm4+KCAmVGVzdDo6Zm9vTjwxPiApOwoKICAgIHJldHVybiAwOwp9