#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;
}