#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;
}