#include <iostream>
#include <functional>
using namespace std;
class Me {};
using TGetter = std::function<std::string( Me* )>;
std::string getter( Me* me )
{
return std::string( "string" );
}
template<typename TGetter>
class Handler
{
public:
using TValue = typename TGetter::result_type;
Handler( TGetter getter ) :m_getter( getter ) {}
TValue get()
{
Me m;
return m_getter( &m );
}
private:
TGetter m_getter;
};
int main()
{
using MyHanlder = Handler<TGetter>;
MyHanlder h(getter);
MyHanlder::TValue s = h.get();
cout << s;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBNZSB7fTsKCnVzaW5nIFRHZXR0ZXIgICA9IHN0ZDo6ZnVuY3Rpb248c3RkOjpzdHJpbmcoIE1lKiApPjsKCnN0ZDo6c3RyaW5nIGdldHRlciggTWUqIG1lICkKewogIHJldHVybiBzdGQ6OnN0cmluZyggInN0cmluZyIgKTsKfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRHZXR0ZXI+CiAgICBjbGFzcyBIYW5kbGVyCiAgICB7CgogICAgcHVibGljOgogICAgICB1c2luZyBUVmFsdWUgPSAgdHlwZW5hbWUgVEdldHRlcjo6cmVzdWx0X3R5cGU7CiAgICAgIEhhbmRsZXIoIFRHZXR0ZXIgZ2V0dGVyICkgOm1fZ2V0dGVyKCBnZXR0ZXIgKSB7fQogICAgICBUVmFsdWUgZ2V0KCkKICAgICAgewogICAgICAgIE1lIG07CiAgICAgICAgcmV0dXJuIG1fZ2V0dGVyKCAmbSApOwogICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgVEdldHRlciBtX2dldHRlcjsKICAgIH07CgogICAgaW50IG1haW4oKQogICAgewogICAgICB1c2luZyBNeUhhbmxkZXIgPSBIYW5kbGVyPFRHZXR0ZXI+OwogICAgICBNeUhhbmxkZXIgaChnZXR0ZXIpOwogICAgICBNeUhhbmxkZXI6OlRWYWx1ZSBzID0gaC5nZXQoKTsKICAgICAgY291dCA8PCBzOwogICAgfQ==