Скорее всего, можно объединить объекты под одной логикой, т.е. создать указатель на базовый класс Base* и хранить матрицу таких указателей, а дальше работать со всеми объектами через их общие методы (по-простому так).
std::vector <std::vector <Base*>> matrix(n, std::vector <Base*>(m));
for(size_t i = 0; i < n; ++i)
for(size_t j = 0; j < m; ++j)
matrix[i][j]->doSmth();
В таких случая пишется свой VersionUpdater, который перестраивает структуру хранения данных, т.е. если мы хотим добавить новое поле в БД, то нужно сохранить старую информацию и добавить к ней новую (например, перенос в новую таблицу с добавленным полем). Такой подход позволит корректно обрабатывать старые данные и добавлять новые прямо в коде, а в VersionUpdater корректно все завершаем.
И никогда не используйте std::vector <bool>
alenacpp.blogspot.ru/2005/06/vector.html
Совет #18 (Мейерс)!
Можно, например, в инте все хранить или, на крайний случай, std::bitset.
Для общего случая можно использовать циклическую очередь или подобного рода циклические контейнеры. Посмотрел первый элемент и в конец его. Все банально и просто!