#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";
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgUGVyc29uIHsKCXByaXZhdGU6CgkJaW50IGFnZTsKCQlzdGQ6OnN0cmluZyBuYW1lOwoJcHVibGljOgoJCVBlcnNvbihpbnQgYSwgc3RkOjpzdHJpbmcgbikgOiBhZ2UoYSksIG5hbWUobikge30KCQlpbnQgZ2V0QWdlKCkgY29uc3QgeyByZXR1cm4gYWdlOyB9CgkJc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWU7IH0KCQlib29sIG9wZXJhdG9yPChjb25zdCBQZXJzb24mIHJocykgY29uc3Qge3JldHVybiBuYW1lIDwgcmhzLm5hbWU7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBQdHJQcm94eSB7CiAgICBwcml2YXRlOgogICAgICAgIGNvbnN0IFQqIG1fb2JqZWN0OwoKICAgIHB1YmxpYzoKICAgICAgICBQdHJQcm94eShjb25zdCBUJiBvYmopIDogbV9vYmplY3QoJm9iaikge30KICAgICAgICBQdHJQcm94eShjb25zdCBUKiBvYmopIDogbV9vYmplY3Qob2JqKSAge30KCiAgICAgICAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm1fb2JqZWN0OyB9CiAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0OyB9Cn07CgppbnQgbWFpbigpCnsKCXN0ZDo6c2V0PFBlcnNvbj4gcDE7CglhdXRvIHZhciA9IHAxLmluc2VydChQZXJzb24oMzAsICJCaWxsIikpOwoJCgkvLyBQdXIgdGhlIGFkZHJlc3Mgb2YgdGhlIFBlcnNvbiBpbiBwMSBpbnRvIHAyCglzdGQ6OnZlY3RvcjxQZXJzb24qPiBwMjsKCXAyLnB1c2hfYmFjayhjb25zdF9jYXN0PFBlcnNvbio+KCYoKih2YXIuZmlyc3QpKSkpOwoJCgkKCQoJc3RkOjp2ZWN0b3I8aW50PiBkYXRhOwoJCglhdXRvIHRoZV9sYW1iZGEgPSBbXShjb25zdCBQdHJQcm94eTxQZXJzb24+IHBwKSB7cmV0dXJuIHBwLT5nZXRBZ2UoKTt9OwoJCglzdGQ6OnRyYW5zZm9ybShwMS5iZWdpbigpLCBwMS5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGEpLCB0aGVfbGFtYmRhKTsKCXN0ZDo6dHJhbnNmb3JtKHAyLmJlZ2luKCksIHAyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YSksIHRoZV9sYW1iZGEpOwoJCglmb3IgKGludCBhZ2UgOiBkYXRhKQoJewoJCXN0ZDo6Y291dCA8PCBhZ2UgPDwgIlxuIjsKCX0KCQp9