#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==
compilation info
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
stdout