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