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

class Person {
	private:
		int age;
		std::string name;
	public:
		Person(int a, std::string n) : age(a), name(n) {}
		int getAge() const { return age; }
		std::string getName() const { return name; }
		bool operator<(const Person& rhs) const {return name < rhs.name; }
};

template <typename T>
class PtrProxy {
    private:
        const T* m_object;

    public:
        PtrProxy(const T& obj) : m_object(&obj) {}
        PtrProxy(const T* obj) : m_object(obj)  {}

        const T& operator*() const { return *m_object; }
        const T* operator->() const { return m_object; }
};

int main()
{
	std::set<Person> p1;
	auto var = p1.insert(Person(30, "Bill"));
	
	// Pur the address of the Person in p1 into p2
	std::vector<Person*> p2;
	p2.push_back(const_cast<Person*>(&(*(var.first))));
	
	
	
	std::vector<int> data;
	
	auto the_lambda = [](const PtrProxy<Person> pp) {return pp->getAge();};
	
	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";
	}
	
}