#include <iostream>
#include <map>
#include <tuple>
template <typename T1, typename T2, typename T3>
class foobar
{
public:
void add(T1 t1, T2 t2, T3 t3)
{
m1[t1] = std::make_tuple(t1, t2, t3);
m2[t2] = std::make_tuple(t1, t2, t3);
}
std::tuple<T1,T2,T3> getA(T1 t1)
{
return m1[t1];
}
std::tuple<T1,T2,T3> getB(T2 t2)
{
return m2[t2];
}
private:
std::map<T1,std::tuple<T1,T2,T3>> m1;
std::map<T2,std::tuple<T1,T2,T3>> m2;
};
int main()
{
foobar<int, int, bool> array; // or something along those lines
array.add(1, 101, true);
array.add(2, 102, false);
auto res1 = array.getA(1); // returns first object
auto res2 = array.getA(2); // returns second object
auto res3 = array.getB(102); // returns second object again
std::cout << std::get<0>(res1) << std::endl;
std::cout << std::get<1>(res2) << std::endl;
std::cout << std::get<2>(res3) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dHVwbGU+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KY2xhc3MgZm9vYmFyCnsKcHVibGljOgogICAgdm9pZCBhZGQoVDEgdDEsIFQyIHQyLCBUMyB0MykKICAgIHsKICAgICAgICBtMVt0MV0gPSBzdGQ6Om1ha2VfdHVwbGUodDEsIHQyLCB0Myk7CiAgICAgICAgbTJbdDJdID0gc3RkOjptYWtlX3R1cGxlKHQxLCB0MiwgdDMpOwogICAgfQogICAgCiAgICBzdGQ6OnR1cGxlPFQxLFQyLFQzPiBnZXRBKFQxIHQxKQogICAgewogICAgICAgIHJldHVybiBtMVt0MV07CiAgICB9CiAgICAKICAgIHN0ZDo6dHVwbGU8VDEsVDIsVDM+IGdldEIoVDIgdDIpCiAgICB7CiAgICAgICAgcmV0dXJuIG0yW3QyXTsKICAgIH0KICAgIApwcml2YXRlOgogICAgc3RkOjptYXA8VDEsc3RkOjp0dXBsZTxUMSxUMixUMz4+IG0xOwogICAgc3RkOjptYXA8VDIsc3RkOjp0dXBsZTxUMSxUMixUMz4+IG0yOwp9OwoKaW50IG1haW4oKQp7CiAgICBmb29iYXI8aW50LCBpbnQsIGJvb2w+IGFycmF5OyAgLy8gb3Igc29tZXRoaW5nIGFsb25nIHRob3NlIGxpbmVzCiAgICAKICAgIGFycmF5LmFkZCgxLCAxMDEsIHRydWUpOwogICAgYXJyYXkuYWRkKDIsIDEwMiwgZmFsc2UpOwogICAgCiAgICBhdXRvIHJlczEgPSBhcnJheS5nZXRBKDEpOyAvLyByZXR1cm5zIGZpcnN0IG9iamVjdAogICAgYXV0byByZXMyID0gYXJyYXkuZ2V0QSgyKTsgICAvLyByZXR1cm5zIHNlY29uZCBvYmplY3QKICAgIGF1dG8gcmVzMyA9IGFycmF5LmdldEIoMTAyKTsgLy8gcmV0dXJucyBzZWNvbmQgb2JqZWN0IGFnYWluCiAgICAKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmdldDwwPihyZXMxKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpnZXQ8MT4ocmVzMikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Z2V0PDI+KHJlczMpIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==