#include <functional>
#include <vector>
#include <iostream>
using std::cout;
using std::endl;
struct S {
std::function< void() > func;
//S( std::function< void() > && f ) : func( f ) {}
};
void foo( const S & s ) {
if ( s.func ) {
cout << "ok : ";
s.func();
}
else {
cout << "fail" << endl;
}
}
void bar_i( int i ) { cout << i << endl; }
void bar( std::vector< int > i ) { cout << i[ 0 ] << endl; }
int main() {
foo( S{ std::bind( bar_i, 1 ) } );
S s_i{ std::bind( bar_i, 2 ) };
foo( s_i );
std::vector< int > one = { 42 };
foo( S{ std::bind( bar, one ) } );
S s{ std::bind( bar, one ) };
foo( s );
}
ICAgICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogICAgI2luY2x1ZGUgPHZlY3Rvcj4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB1c2luZyBzdGQ6OmNvdXQ7CiAgICB1c2luZyBzdGQ6OmVuZGw7CgogICAgc3RydWN0IFMgewogICAgICAgIHN0ZDo6ZnVuY3Rpb248IHZvaWQoKSA+IGZ1bmM7CiAgICAgICAgLy9TKCBzdGQ6OmZ1bmN0aW9uPCB2b2lkKCkgPiAmJiBmICkgOiBmdW5jKCBmICkge30KICAgIH07CgogICAgdm9pZCBmb28oIGNvbnN0IFMgJiBzICkgewogICAgICAgIGlmICggcy5mdW5jICkgewogICAgICAgICAgICBjb3V0IDw8ICJvayA6ICI7CiAgICAgICAgICAgIHMuZnVuYygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCAiZmFpbCIgPDwgZW5kbDsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBiYXJfaSggaW50IGkgKSB7IGNvdXQgPDwgaSA8PCBlbmRsOyB9CiAgICB2b2lkIGJhciggc3RkOjp2ZWN0b3I8IGludCA+IGkgKSB7IGNvdXQgPDwgaVsgMCBdIDw8IGVuZGw7IH0KCiAgICBpbnQgbWFpbigpIHsKICAgICAgICBmb28oIFN7IHN0ZDo6YmluZCggYmFyX2ksIDEgKSB9ICk7CiAgICAgICAgUyBzX2l7IHN0ZDo6YmluZCggYmFyX2ksIDIgKSB9OwogICAgICAgIGZvbyggc19pICk7CgogICAgICAgIHN0ZDo6dmVjdG9yPCBpbnQgPiBvbmUgPSB7IDQyIH07CiAgICAgICAgZm9vKCBTeyBzdGQ6OmJpbmQoIGJhciwgb25lICkgfSApOwogICAgICAgIFMgc3sgc3RkOjpiaW5kKCBiYXIsIG9uZSApIH07CiAgICAgICAgZm9vKCBzICk7CgogICAgfQo=