#include <string>
#include <functional>
#include <iostream>
template<class T>
struct reference_only {
T& t;
operator T&(){ return t; }
operator T()=delete;
reference_only(T& tin):t(tin){}
};
struct Foo {};
typedef void func_type(Foo *&);
typedef std::function<void(reference_only<Foo*>)> FunctionalType;
void foo1(Foo *)
{
std::cout << "foo1\n";
}
void foo2(Foo *&)
{
std::cout << "foo2\n";
}
int main()
{
Foo f;
Foo* pf = &f;
#if 0
FunctionalType f1 = foo1;
f1(pf);
#else
FunctionalType f2 = foo2;
f2(pf);
#endif
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgc3RydWN0IHJlZmVyZW5jZV9vbmx5IHsKICAgICAgVCYgdDsKICAgICAgb3BlcmF0b3IgVCYoKXsgcmV0dXJuIHQ7IH0KICAgICAgb3BlcmF0b3IgVCgpPWRlbGV0ZTsKICAgICAgcmVmZXJlbmNlX29ubHkoVCYgdGluKTp0KHRpbil7fQogICAgfTsKCiBzdHJ1Y3QgRm9vIHt9OwogdHlwZWRlZiB2b2lkIGZ1bmNfdHlwZShGb28gKiYpOwogdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQocmVmZXJlbmNlX29ubHk8Rm9vKj4pPiBGdW5jdGlvbmFsVHlwZTsKCiB2b2lkIGZvbzEoRm9vICopCiB7CiAgICAgc3RkOjpjb3V0IDw8ICJmb28xXG4iOwogfQogdm9pZCBmb28yKEZvbyAqJikKIHsKICAgICBzdGQ6OmNvdXQgPDwgImZvbzJcbiI7CiB9CgogaW50IG1haW4oKQogewogICBGb28gZjsgICAgIAogICBGb28qIHBmID0gJmY7CiAjaWYgMAogICBGdW5jdGlvbmFsVHlwZSBmMSA9IGZvbzE7CiAgIGYxKHBmKTsKICNlbHNlCiAgIEZ1bmN0aW9uYWxUeXBlIGYyID0gZm9vMjsKICAgZjIocGYpOwojZW5kaWYKfQ==