#include <iostream>
#include <vector>
#include <memory>
struct Foo
{
std::vector<int> bars;
std::vector<char> bazs;
std::size_t size;
Foo(size_t size, int bar = 0, char baz = 0) :
bars(size, bar), bazs(size, baz), size{size}
{
}
auto operator[](size_t n)
{
// if (n >= size) ...
struct
{
int &bar;
char &baz;
} temp{ bars[n], bazs[n] };
return temp;
}
};
int main()
{
Foo arr(30, 100, 'a'); // 30 items
std::cout << arr[29].bar << std::endl;
std::cout << arr[29].baz << std::endl;
std::cout << arr.bars[29] << std::endl;
std::cout << arr.bazs[29] << std::endl;
std::unique_ptr<Foo> arr2 = std::make_unique<Foo>(25, 10, 'b'); // 25 items
std::cout << arr2->operator[](15).bar << std::endl;
std::cout << arr2->operator[](15).baz << std::endl;
arr2->bars[15] = 11;
std::cout << arr2->bars[15] << std::endl;
arr2->bazs[15] = 'c';
std::cout << arr2->bazs[15] << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEZvbwp7CglzdGQ6OnZlY3RvcjxpbnQ+IGJhcnM7CglzdGQ6OnZlY3RvcjxjaGFyPiBiYXpzOwoJc3RkOjpzaXplX3Qgc2l6ZTsKCQoJRm9vKHNpemVfdCBzaXplLCBpbnQgYmFyID0gMCwgY2hhciBiYXogPSAwKSA6CgkJYmFycyhzaXplLCBiYXIpLCBiYXpzKHNpemUsIGJheiksIHNpemV7c2l6ZX0KCXsKCX0KCglhdXRvIG9wZXJhdG9yW10oc2l6ZV90IG4pCgl7CgkJLy8gaWYgKG4gPj0gc2l6ZSkgLi4uCgkJc3RydWN0CgkJewoJCQlpbnQgJmJhcjsKCQkJY2hhciAmYmF6OwoJCX0gdGVtcHsgYmFyc1tuXSwgYmF6c1tuXSB9OwoJCXJldHVybiB0ZW1wOwoJfQp9OwoKCmludCBtYWluKCkKewoJRm9vIGFycigzMCwgMTAwLCAnYScpOyAvLyAzMCBpdGVtcwoKCXN0ZDo6Y291dCA8PCBhcnJbMjldLmJhciA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgYXJyWzI5XS5iYXogPDwgc3RkOjplbmRsOwoKCXN0ZDo6Y291dCA8PCBhcnIuYmFyc1syOV0gPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGFyci5iYXpzWzI5XSA8PCBzdGQ6OmVuZGw7CgoJc3RkOjp1bmlxdWVfcHRyPEZvbz4gYXJyMiA9IHN0ZDo6bWFrZV91bmlxdWU8Rm9vPigyNSwgMTAsICdiJyk7IC8vIDI1IGl0ZW1zCgoJc3RkOjpjb3V0IDw8IGFycjItPm9wZXJhdG9yW10oMTUpLmJhciA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgYXJyMi0+b3BlcmF0b3JbXSgxNSkuYmF6IDw8IHN0ZDo6ZW5kbDsKCglhcnIyLT5iYXJzWzE1XSA9IDExOwoJc3RkOjpjb3V0IDw8IGFycjItPmJhcnNbMTVdIDw8IHN0ZDo6ZW5kbDsKCWFycjItPmJhenNbMTVdID0gJ2MnOwoJc3RkOjpjb3V0IDw8IGFycjItPmJhenNbMTVdIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==