#include <string> 
#include <iostream> 
 
template  < class  T, class  Factory, Factory f>  class  add_ctor { 
    public : 
        add_ctor( )  :  obj( f( ) ( ) )  { 
        } 
        T*  operator- > ( )  { 
            return  obj; 
        } 
    private : 
        T*  obj; 
} ; 
 
class  A { 
    public : 
        std:: string  v; 
        static  A createOne( ) ; 
    private : 
        A( ) ; 
} ; 
A A:: createOne ( )  { 
    A a; 
    a.v  =  "Hello!" ; 
    return  a; 
} 
 
int  main( )  { 
    // this should work: 
    add_ctor< A, decltype( & A:: createOne ) , & A:: createOne >  added_a; 
    std:: cout  <<  added_a- > v <<  "\n " ; 
 
    // this should error: 
    //A non_added_a; 
    //std::cout << non_added_a.v << "\n"; 
    return  0 ; 
} 
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEZhY3RvcnksIEZhY3RvcnkgZj4gY2xhc3MgYWRkX2N0b3IgewogICAgcHVibGljOgogICAgICAgIGFkZF9jdG9yKCkgOiBvYmooZigpKCkpIHsKICAgICAgICB9CiAgICAgICAgVCogb3BlcmF0b3ItPigpIHsKICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICB9CiAgICBwcml2YXRlOgogICAgICAgIFQqIG9iajsKfTsKCmNsYXNzIEEgewogICAgcHVibGljOgogICAgICAgIHN0ZDo6c3RyaW5nIHY7CiAgICAgICAgc3RhdGljIEEgY3JlYXRlT25lKCk7CiAgICBwcml2YXRlOgogICAgICAgIEEoKTsKfTsKQSBBOjpjcmVhdGVPbmUoKSB7CiAgICBBIGE7CiAgICBhLnYgPSAiSGVsbG8hIjsKICAgIHJldHVybiBhOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIHRoaXMgc2hvdWxkIHdvcms6CiAgICBhZGRfY3RvcjxBLCBkZWNsdHlwZSgmQTo6Y3JlYXRlT25lKSwgJkE6OmNyZWF0ZU9uZT4gYWRkZWRfYTsKICAgIHN0ZDo6Y291dCA8PCBhZGRlZF9hLT52IDw8ICJcbiI7CiAgICAKICAgIC8vIHRoaXMgc2hvdWxkIGVycm9yOgogICAgLy9BIG5vbl9hZGRlZF9hOwogICAgLy9zdGQ6OmNvdXQgPDwgbm9uX2FkZGVkX2EudiA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0=
				
				 
			
				
			
			
				
	
		
	
		 
	prog.cpp: In constructor 'add_ctor<T, Factory, f>::add_ctor() [with T = A, Factory = A (*)(), Factory f = A::createOne]':
prog.cpp:30:57:   instantiated from here
prog.cpp:6:31: error: no match for call to '(A) ()'