#include <vector>
#include <iostream>
struct Parent
{
void use() { std::cout << "Parent\n"; }
};
struct Derived : public Parent
{
void use() { std::cout << "Derived\n"; }
};
struct Helper
{
Helper(Parent *p) : obj(p) {}
Parent *const obj;
operator Derived *() { return static_cast<Derived *>(obj); }
Derived *operator ->() { return static_cast<Derived *>(obj); }
};
template <typename T> struct THelper
{
THelper(Parent *p) : obj(p) {}
Parent *const obj;
operator T *() { return static_cast<T *>(obj); }
T *operator ->() { return static_cast<T *>(obj); }
};
int main()
{
std::vector<Parent*> objects { new Derived(), new Derived() };
for (Helper h : objects) {
h->use();
}
for (THelper<Derived> h : objects) {
Derived *d = h;
d->use();
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFBhcmVudAp7Cgl2b2lkIHVzZSgpIHsgc3RkOjpjb3V0IDw8ICJQYXJlbnRcbiI7IH0KfTsKCnN0cnVjdCBEZXJpdmVkIDogcHVibGljIFBhcmVudAp7Cgl2b2lkIHVzZSgpIHsgc3RkOjpjb3V0IDw8ICJEZXJpdmVkXG4iOyB9Cn07CgpzdHJ1Y3QgSGVscGVyCnsKCUhlbHBlcihQYXJlbnQgKnApIDogb2JqKHApIHt9CglQYXJlbnQgKmNvbnN0IG9iajsKCW9wZXJhdG9yIERlcml2ZWQgKigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWQgKj4ob2JqKTsgfQoJRGVyaXZlZCAqb3BlcmF0b3IgLT4oKSB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkICo+KG9iaik7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVEhlbHBlcgp7CglUSGVscGVyKFBhcmVudCAqcCkgOiBvYmoocCkge30KCVBhcmVudCAqY29uc3Qgb2JqOwoJb3BlcmF0b3IgVCAqKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihvYmopOyB9CglUICpvcGVyYXRvciAtPigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4ob2JqKTsgfQp9OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxQYXJlbnQqPiBvYmplY3RzIHsgbmV3IERlcml2ZWQoKSwgbmV3IERlcml2ZWQoKSB9OwoKICAgIGZvciAoSGVscGVyIGggOiBvYmplY3RzKSB7CiAgICAgICAgaC0+dXNlKCk7CiAgICB9CgogICAgZm9yIChUSGVscGVyPERlcml2ZWQ+IGggOiBvYmplY3RzKSB7CiAgICAgICAgRGVyaXZlZCAqZCA9IGg7CiAgICAgICAgZC0+dXNlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=