#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class Person {
	string name;
public:
	Person(string n) : name(n) {}
	string getName() const { return name; }
};

const Person* make_ptr(const Person* p) { return p; }
const Person* make_ptr(const Person& p) { return &p; }

template<typename T, typename R>
void xform(vector<T>& from, vector<R>& to) {
	transform(from.begin(), from.end(), back_inserter(to),
        [&](T &p) { return make_ptr(p)->getName(); }
    );
}

int main() {
	Person p0("quick");
	Person p1("brown");
	Person p2("fox");
	Person p3("jumps");
	Person p4("over");
	Person p5("the");
	Person p6("lazy");
	Person p7("dog");
	vector<Person> vp;
	vector<Person*> vpp;
	vp.push_back(p0);
	vpp.push_back(&p0);
	vp.push_back(p1);
	vpp.push_back(&p1);
	vp.push_back(p2);
	vpp.push_back(&p2);
	vp.push_back(p3);
	vpp.push_back(&p3);
	vp.push_back(p4);
	vpp.push_back(&p4);
	vp.push_back(p5);
	vpp.push_back(&p5);
	vp.push_back(p6);
	vpp.push_back(&p6);
	vp.push_back(p7);
	vpp.push_back(&p7);
	vector<string> res;
	xform(vp, res);
	xform(vpp, res);
    for (int i = 0 ; i != res.size() ; i++) {
    	cout << res[i] << endl;
    }
	return 0;
}