#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=