#include <string> 
#include <iostream> 
 
template  < class  T, class  Factory>  class  add_ctor { 
    public : 
        add_ctor( )  :  obj( Factory( ) )  { 
        } 
        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 ) >  added_a; 
    std:: cout  <<  added_a- > v <<  "\n " ; 
 
    // this should error: 
    //A non_added_a; 
    //std::cout << non_added_a.v << "\n"; 
    return  0 ; 
} 
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEZhY3Rvcnk+IGNsYXNzIGFkZF9jdG9yIHsKICAgIHB1YmxpYzoKICAgICAgICBhZGRfY3RvcigpIDogb2JqKEZhY3RvcnkoKSkgewogICAgICAgIH0KICAgICAgICBUKiBvcGVyYXRvci0+KCkgewogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgIH0KICAgIHByaXZhdGU6CiAgICAgICAgVCogb2JqOwp9OwoKY2xhc3MgQSB7CiAgICBwdWJsaWM6CiAgICAgICAgc3RkOjpzdHJpbmcgdjsKICAgICAgICBzdGF0aWMgQSBjcmVhdGVPbmUoKTsKICAgIHByaXZhdGU6CiAgICAgICAgQSgpOwp9OwpBIEE6OmNyZWF0ZU9uZSgpIHsKICAgIEEgYTsKICAgIGEudiA9ICJIZWxsbyEiOwogICAgcmV0dXJuIGE7Cn0KCmludCBtYWluKCkgewogICAgLy8gdGhpcyBzaG91bGQgd29yazoKICAgIGFkZF9jdG9yPEEsIGRlY2x0eXBlKCZBOjpjcmVhdGVPbmUpPiBhZGRlZF9hOwogICAgc3RkOjpjb3V0IDw8IGFkZGVkX2EtPnYgPDwgIlxuIjsKICAgIAogICAgLy8gdGhpcyBzaG91bGQgZXJyb3I6CiAgICAvL0Egbm9uX2FkZGVkX2E7CiAgICAvL3N0ZDo6Y291dCA8PCBub25fYWRkZWRfYS52IDw8ICJcbiI7CiAgICByZXR1cm4gMDsKfQ==
				
				 
			
				
			
			
				
	
		
	
		 
	prog.cpp: In constructor 'add_ctor<T, Factory>::add_ctor() [with T = A, Factory = A (*)()]':
prog.cpp:30:42:   instantiated from here
prog.cpp:6:35: error: cannot convert 'A (*)()' to 'A*' in initialization