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

struct Person {
	int age;
	std::string name;
};

class PersonProxy {
	public:
		PersonProxy(Person& p)
		: person(&p) {}
		PersonProxy(Person* p)
		: person(p) {}
		
		Person& operator*() { return *person; }
		Person* operator->() { return person; }
		
	private:
		Person* person;
};

int main()
{
	std::vector<Person> p1;
	p1.push_back(Person{42, "Bob"});
	
	Person bill{30, "Bill"};
	std::set<Person*> p2;
	p2.insert(&bill);
	
	std::vector<int> data;
	
	auto the_lambda = [](PersonProxy pp) {return pp->age;};
	
	std::transform(p1.begin(), p1.end(), std::back_inserter(data), the_lambda);
	std::transform(p2.begin(), p2.end(), std::back_inserter(data), the_lambda);
	
	for (int age : data)
	{
		std::cout << age << "\n";
	}
	
}