#include <iostream>
#include <string>
using namespace std;
struct NO_INIT {};
class Thing {
int a;
public:
Thing(int v = 0): a (v) {}
Thing(NO_INIT) {}
virtual const char * type_name(){ return "Thing"; }
virtual int value() { return a; }
};
class OtherThing : public Thing {
public:
OtherThing(int v): Thing(v) {}
OtherThing(NO_INIT ni): Thing(ni) {}
virtual const char * type_name() { return "Other Thing"; }
};
template <typename TO_T>
inline TO_T* turn_thing_to(Thing* p)
{
return ::new(p) TO_T(NO_INIT());
}
int main() {
Thing * thing = new Thing(42);
std::cout << thing->type_name() << "\n";
std::cout << thing->value() << "\n";
turn_thing_to<OtherThing>(thing);
std::cout << thing->type_name() << "\n";
std::cout << thing->value() << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBOT19JTklUIHt9OwoKY2xhc3MgVGhpbmcgewoJaW50IGE7CnB1YmxpYzoKICAgIFRoaW5nKGludCB2ID0gMCk6IGEgKHYpIHt9CiAgICBUaGluZyhOT19JTklUKSB7fSAKCXZpcnR1YWwgY29uc3QgY2hhciAqIHR5cGVfbmFtZSgpeyByZXR1cm4gIlRoaW5nIjsgfQoJdmlydHVhbCBpbnQgdmFsdWUoKSB7IHJldHVybiBhOyB9Cn07CgpjbGFzcyBPdGhlclRoaW5nIDogcHVibGljIFRoaW5nIHsKcHVibGljOgoJT3RoZXJUaGluZyhpbnQgdik6IFRoaW5nKHYpIHt9CglPdGhlclRoaW5nKE5PX0lOSVQgbmkpOiBUaGluZyhuaSkge30KCQoJdmlydHVhbCBjb25zdCBjaGFyICogdHlwZV9uYW1lKCkgeyByZXR1cm4gIk90aGVyIFRoaW5nIjsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRPX1Q+CmlubGluZSBUT19UKiB0dXJuX3RoaW5nX3RvKFRoaW5nKiBwKSAKewogIHJldHVybiA6Om5ldyhwKSBUT19UKE5PX0lOSVQoKSk7IAp9CgppbnQgbWFpbigpIHsKCVRoaW5nICogdGhpbmcgPSBuZXcgVGhpbmcoNDIpOwoJc3RkOjpjb3V0IDw8IHRoaW5nLT50eXBlX25hbWUoKSA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8IHRoaW5nLT52YWx1ZSgpIDw8ICJcbiI7CgkKCXR1cm5fdGhpbmdfdG88T3RoZXJUaGluZz4odGhpbmcpOwoJc3RkOjpjb3V0IDw8IHRoaW5nLT50eXBlX25hbWUoKSA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8IHRoaW5nLT52YWx1ZSgpIDw8ICJcbiI7CglyZXR1cm4gMDsKfQ==