#include <iostream>
#include <string>
using namespace std;
class Thing {
int a;
public:
Thing(int v = 0): a (v) {}
virtual const char * type_name(){ return "Thing"; }
virtual int value() { return a; }
};
class OtherThing : public Thing {
public:
OtherThing(int v): Thing(v) {}
OtherThing() {}
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(static_cast<TO_T&&>(*p));
}
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBUaGluZyB7CglpbnQgYTsKcHVibGljOgogICAgVGhpbmcoaW50IHYgPSAwKTogYSAodikge30KCXZpcnR1YWwgY29uc3QgY2hhciAqIHR5cGVfbmFtZSgpeyByZXR1cm4gIlRoaW5nIjsgfQoJdmlydHVhbCBpbnQgdmFsdWUoKSB7IHJldHVybiBhOyB9Cn07CgpjbGFzcyBPdGhlclRoaW5nIDogcHVibGljIFRoaW5nIHsKcHVibGljOgoJT3RoZXJUaGluZyhpbnQgdik6IFRoaW5nKHYpIHt9CglPdGhlclRoaW5nKCkge30KCQoJdmlydHVhbCBjb25zdCBjaGFyICogdHlwZV9uYW1lKCkgeyByZXR1cm4gIk90aGVyIFRoaW5nIjsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRPX1Q+CmlubGluZSBUT19UKiB0dXJuX3RoaW5nX3RvKFRoaW5nKiBwKSAKewogIHJldHVybiA6Om5ldyhwKSBUT19UKHN0YXRpY19jYXN0PFRPX1QmJj4oKnApKTsgCn0KCmludCBtYWluKCkgewoJVGhpbmcgKiB0aGluZyA9IG5ldyBUaGluZyg0Mik7CglzdGQ6OmNvdXQgPDwgdGhpbmctPnR5cGVfbmFtZSgpIDw8ICJcbiI7CglzdGQ6OmNvdXQgPDwgdGhpbmctPnZhbHVlKCkgPDwgIlxuIjsKCQoJdHVybl90aGluZ190bzxPdGhlclRoaW5nPih0aGluZyk7CglzdGQ6OmNvdXQgPDwgdGhpbmctPnR5cGVfbmFtZSgpIDw8ICJcbiI7CglzdGQ6OmNvdXQgPDwgdGhpbmctPnZhbHVlKCkgPDwgIlxuIjsKCXJldHVybiAwOwp9