#include <string> 
#include <iostream> 
 
template  < class  T, class  Factory>  class  add_ctor { 
    public : 
        add_ctor< T, Factory>  :  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+IGNsYXNzIGFkZF9jdG9yIHsKICAgIHB1YmxpYzoKICAgICAgICBhZGRfY3RvcjxULCBGYWN0b3J5PiA6IG9iaihGYWN0b3J5KCkpIHsKICAgICAgICB9CiAgICAgICAgVCogb3BlcmF0b3ItPigpIHsKICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICB9CiAgICBwcml2YXRlOgogICAgICAgIFQqIG9iajsKfTsKCmNsYXNzIEEgewogICAgcHVibGljOgogICAgICAgIHN0ZDo6c3RyaW5nIHY7CiAgICAgICAgc3RhdGljIEEgY3JlYXRlT25lKCk7CiAgICBwcml2YXRlOgogICAgICAgIEEoKTsKfTsKQSBBOjpjcmVhdGVPbmUoKSB7CiAgICBBIGE7CiAgICBhLnYgPSAiSGVsbG8hIjsKICAgIHJldHVybiBhOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIHRoaXMgc2hvdWxkIHdvcms6CiAgICBhZGRfY3RvcjxBLCBkZWNsdHlwZSgmQTo6Y3JlYXRlT25lKT4gYWRkZWRfYTsKICAgIHN0ZDo6Y291dCA8PCBhZGRlZF9hLT52IDw8ICJcbiI7CiAgICAKICAgIC8vIHRoaXMgc2hvdWxkIGVycm9yOgogICAgLy9BIG5vbl9hZGRlZF9hOwogICAgLy9zdGQ6OmNvdXQgPDwgbm9uX2FkZGVkX2EudiA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0=