Перегрузка оператора[] с++

Есть структура данных, полями которой являются std::vector. Как мне перегрузить оператор[], что бы можно было работать по индексам с элементами данной структуры?

Код структуры:

struct matchBlobs {
        std::vector<cv::Point> leftBlob;
        std::vector<cv::Point> rightBlob;
        std::vector<int> colorPoints;

        matchBlobs() {};

        matchBlobs(cv::Point ptLeft, cv::Point ptRight) {
            leftBlob.push_back(ptLeft);
            rightBlob.push_back(ptRight);
        }

        matchBlobs(cv::Point ptLeft, cv::Point ptRight, int color) {
            leftBlob.push_back(ptLeft);
            rightBlob.push_back(ptRight);
            colorPoints.push_back(color);
        }

        void push_back(cv::Point ptLeft, cv::Point ptRight) {
            leftBlob.push_back(ptLeft);
            rightBlob.push_back(ptRight);
        }
        void push_back_color(int color) {
            colorPoints.push_back(color);
        }
        int size() const {
            return leftBlob.size();
        }
    };

И то как я планирую использовать []

matchBlobs outputMatchBlobs, tempMatchBlobs;
....
            for (int i = 0; i < n; ++i) {
                outputMatchBlobs[(i + n - k) % n] = tempMatchBlobs[i];
            }

Ответы (2 шт):

Автор решения: Chorkov

Если доступ к отдельным элементам "записи" то можно воспользоваться кортежем из ссылок:

auto operator[]( size_t i ) { return std::tie( leftBlob[i], rightBlob[i], colorPoints[i] ); }
auto operator[]( size_t i ) const { return std::make_tuple( leftBlob[i], rightBlob[i], colorPoints[i] ); }

Если доступ к элементам данных - нужен, то попробуйте поменять способ хранения:

struct value_type { cv::Point leftBlob, rightBlob; int colorPoint; };
std::vector< value_type > data;
→ Ссылка
Автор решения: AR Hovsepyan

Если подразумевается, что вектора могут хранить разное количество cv::Point, то стоит хранить структуру указателей. Кроме того, нужно стараться не повторять и сокращать код. Первоначально это может выглядеть следующим образом:

struct matchBlobs {
using P = cv::Point;
struct Points {
    P* leftBlob = nullptr;
    P* rightBlob = nullptr;
    int colorPoints{};        
    ~Points() {
        delete leftBlob;
        delete rightBlob;
    }
    //copy, = ...
};
std::vector<Points> Blob;
//при создании лучше резервировать какое то количество памяти
explicit matchBlobs(size_t size = 10) { Blob.reserve(size); };

matchBlobs(P ptLeft, P ptRight, int color = 0) {
    push_back(ptLeft, ptRight, color );        
}
void push_back(P ptLeft, P ptRight, int color = 0) {
    Blob.push_back({ new P(ptLeft), new P(ptRight), color });
}
void push_back_color(int color) {
    Blob.push_back({ nullptr, nullptr, color });
}
int size() const {
    //количество не нулевых указателей на левый шарик
    return std::count_if(Blob.begin(), Blob.end(),
        [](P p) { return p; });
}
Points& operator[](const size_t index)
{
    return Blob[index % Blob.size()];
}};

каждый элемент может иметь или не иметь левый или правый blob

→ Ссылка