#include <iostream>
#include <thread>
#include <utility>
using namespace std;
template < typename T>
class OnExitImpl : private T
{
public :
template < typename Y>
OnExitImpl( Y&& todo) : T( std:: forward < Y> ( todo) ) , _doIt( true ) { }
OnExitImpl( OnExitImpl&& other) : T( std:: move ( static_cast < T& > ( other) ) ) , _doIt( other._doIt)
{
other._doIt = false ;
}
~OnExitImpl( )
{
if ( _doIt)
{
( * this ) ( ) ;
}
}
void Cancel( )
{
_doIt = false ;
}
OnExitImpl& operator= ( OnExitImpl&& other)
{
this- > T:: operator = ( std:: move ( static_cast < T& > ( other) ) ) ;
_doIt = other._doIt;
other._doIt = false ;
}
private :
bool _doIt;
} ;
template < typename T>
OnExitImpl< T> OnExit( T action)
{
return OnExitImpl< T> ( std:: move ( action) ) ;
}
int FetchMultithreaded( int stmt)
{
std:: thread * threadPtr = nullptr;
auto onExit = OnExit( [ & ] ( ) { cout << stmt << endl; } ) ;
std:: thread fetchThread( [ & ] ( )
{
auto onExit = OnExit( [ & ] ( ) { cout << stmt << endl; } ) ;
} ) ;
return 0 ;
}
int main( )
{
return FetchMultithreaded( 0 ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8dXRpbGl0eT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgT25FeGl0SW1wbCA6IHByaXZhdGUgVAp7CnB1YmxpYzoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBZPgogICAgT25FeGl0SW1wbChZJiYgdG9kbykgOiBUKHN0ZDo6Zm9yd2FyZDxZPih0b2RvKSksIF9kb0l0KHRydWUpIHt9CgogICAgT25FeGl0SW1wbChPbkV4aXRJbXBsJiYgb3RoZXIpIDogVChzdGQ6Om1vdmUoc3RhdGljX2Nhc3Q8VCY+KG90aGVyKSkpLCBfZG9JdChvdGhlci5fZG9JdCkKICAgIHsKICAgICAgICBvdGhlci5fZG9JdCA9IGZhbHNlOwogICAgfQoKICAgIH5PbkV4aXRJbXBsKCkKICAgIHsKICAgICAgICBpZiAoX2RvSXQpCiAgICAgICAgewogICAgICAgICAgICAoKnRoaXMpKCk7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgQ2FuY2VsKCkKICAgIHsKICAgICAgICBfZG9JdCA9IGZhbHNlOwogICAgfQoKICAgIE9uRXhpdEltcGwmIG9wZXJhdG9yPShPbkV4aXRJbXBsJiYgb3RoZXIpCiAgICB7CiAgICAgICAgdGhpcy0+VDo6b3BlcmF0b3I9KHN0ZDo6bW92ZShzdGF0aWNfY2FzdDxUJj4ob3RoZXIpKSk7CiAgICAgICAgX2RvSXQgPSBvdGhlci5fZG9JdDsKICAgICAgICBvdGhlci5fZG9JdCA9IGZhbHNlOwogICAgfQoKcHJpdmF0ZToKICAgIGJvb2wgX2RvSXQ7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KT25FeGl0SW1wbDxUPiBPbkV4aXQoVCBhY3Rpb24pCnsKICAgIHJldHVybiBPbkV4aXRJbXBsPFQ+KHN0ZDo6bW92ZShhY3Rpb24pKTsKfQoKaW50IEZldGNoTXVsdGl0aHJlYWRlZChpbnQgc3RtdCkKewogICAgc3RkOjp0aHJlYWQqIHRocmVhZFB0ciA9IG51bGxwdHI7CiAgICBhdXRvIG9uRXhpdCA9IE9uRXhpdChbJl0oKXsgY291dCA8PCBzdG10IDw8IGVuZGw7IH0pOwoKICAgIHN0ZDo6dGhyZWFkIGZldGNoVGhyZWFkKFsmXSgpCiAgICB7CiAgICAgICAgYXV0byBvbkV4aXQgPSBPbkV4aXQoWyZdKCl7IGNvdXQgPDwgc3RtdCA8PCBlbmRsOyB9KTsKICAgIH0pOwoKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKICAgIHJldHVybiBGZXRjaE11bHRpdGhyZWFkZWQoMCk7Cn0=