#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 1
FunctionalType f1 = foo1;
f1( pf) ;
#else
FunctionalType f2 = foo2;
f2( pf) ;
#endif
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgc3RydWN0IHJlZmVyZW5jZV9vbmx5IHsKICAgICAgVCYgdDsKICAgICAgb3BlcmF0b3IgVCYoKXsgcmV0dXJuIHQ7IH0KICAgICAgb3BlcmF0b3IgVCgpPWRlbGV0ZTsKICAgICAgcmVmZXJlbmNlX29ubHkoVCYgdGluKTp0KHRpbil7fQogICAgfTsKCiBzdHJ1Y3QgRm9vIHt9OwogdHlwZWRlZiB2b2lkIGZ1bmNfdHlwZShGb28gKiYpOwogdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQocmVmZXJlbmNlX29ubHk8Rm9vKj4pPiBGdW5jdGlvbmFsVHlwZTsKCiB2b2lkIGZvbzEoRm9vICopCiB7CiAgICAgc3RkOjpjb3V0IDw8ICJmb28xXG4iOwogfQogdm9pZCBmb28yKEZvbyAqJikKIHsKICAgICBzdGQ6OmNvdXQgPDwgImZvbzJcbiI7CiB9CgogaW50IG1haW4oKQogewogICBGb28gZjsgICAgIAogICBGb28qIHBmID0gJmY7CiAjaWYgMQogICBGdW5jdGlvbmFsVHlwZSBmMSA9IGZvbzE7CiAgIGYxKHBmKTsKICNlbHNlCiAgIEZ1bmN0aW9uYWxUeXBlIGYyID0gZm9vMjsKICAgZjIocGYpOwojZW5kaWYKfQ==