#include <vector>
#include <set>
#include <iostream>
using namespace std;
class Container
{
public:
Container() {}
Container(int _i) : i(_i) {}
int get_i() const {return i;}
int i;
};
template <
class U,
class V,
template <typename...> class T1,
template <typename...> class T2
>
T2<V> WugMap(
T1<U>& unmapped,
V (U::*method)() const)
{
T2<V> collection;
for (typename T1<U>::iterator i = unmapped.begin(); i != unmapped.end(); ++i)
collection.insert(collection.end(), ((*i).*method)());
return collection;
}
int main()
{
vector<Container> containers;
for (int i = 0; i < 10; ++i) containers.push_back((Container(i)));
set<int> contained = WugMap<Container, int, std::vector, std::set>(containers, &Container::get_i);
for (set<int>::iterator derp = contained.begin(); derp != contained.end(); ++derp) cout << *derp << " " << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIENvbnRhaW5lcgp7CnB1YmxpYzoKICAgIENvbnRhaW5lcigpIHt9CiAgICBDb250YWluZXIoaW50IF9pKSA6IGkoX2kpIHt9CgogICAgaW50IGdldF9pKCkgY29uc3Qge3JldHVybiBpO30KCiAgICBpbnQgaTsKfTsKCiAgICB0ZW1wbGF0ZSA8CiAgICAgICAgY2xhc3MgVSwgCiAgICAgICAgY2xhc3MgViwgCiAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBjbGFzcyBUMSwKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+IGNsYXNzIFQyCiAgICA+CgogICAgVDI8Vj4gV3VnTWFwKAogICAgICAgIFQxPFU+JiB1bm1hcHBlZCwgCiAgICAgICAgViAoVTo6Km1ldGhvZCkoKSBjb25zdCkKICAgIHsKICAgICAgICBUMjxWPiBjb2xsZWN0aW9uOwoJZm9yICh0eXBlbmFtZSBUMTxVPjo6aXRlcmF0b3IgaSA9IHVubWFwcGVkLmJlZ2luKCk7IGkgIT0gdW5tYXBwZWQuZW5kKCk7ICsraSkKICAgICAgICAgICAgY29sbGVjdGlvbi5pbnNlcnQoY29sbGVjdGlvbi5lbmQoKSwgKCgqaSkuKm1ldGhvZCkoKSk7CgogICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwogICAgfQoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8Q29udGFpbmVyPiBjb250YWluZXJzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSBjb250YWluZXJzLnB1c2hfYmFjaygoQ29udGFpbmVyKGkpKSk7CgogICAgc2V0PGludD4gY29udGFpbmVkID0gV3VnTWFwPENvbnRhaW5lciwgaW50LCBzdGQ6OnZlY3Rvciwgc3RkOjpzZXQ+KGNvbnRhaW5lcnMsICZDb250YWluZXI6OmdldF9pKTsKICAgIGZvciAoc2V0PGludD46Oml0ZXJhdG9yIGRlcnAgPSBjb250YWluZWQuYmVnaW4oKTsgZGVycCAhPSBjb250YWluZWQuZW5kKCk7ICsrZGVycCkgY291dCA8PCAqZGVycCA8PCAiICIgPDwgZW5kbDsKfQ==