Основы создания n-мерной коллекции будут примерно такими. Предполагается, что контейнер не может быть переразмерен.
template< typename T >
class MultiDimContainer
{
std::vector<size_t> dims;
std::vector<T> data;
public:
MultiDimContainer( const std::vector<size_t> dims )
{
// work out the product of dims and set data to that size
}
T& at( const std::vector<size_t> & dim )
{
// calculate where it lives in memory and return that element
}
};
Как я реализовал в (), чтобы получить один параметр, вы можете использовать для этого оператор []. Вы, вероятно, захотите 2 перегрузки, одну const и одну неконстантную, и at () будет проверять границы, в то время как operator [] не будет. Возможно, вы захотите, чтобы одна вспомогательная (не шаблонная) функция вычисляла местоположение этого элемента в векторе данных.
Конечно, построение вектора является многошаговым процессом, поэтому вы можете использовать некоторый магический класс для его создания.
Вы также можете иметь оператор [] для вашего контейнера, который будет принимать один size_t и будет возвращать объект ContainerReferencer. Это не настоящий многомерный массив, а кусочек данных, хранящихся в другом месте. Еще раз могут быть константные или неконстантные версии.
Получение нескольких вызовов оператора [] для фильтрации до значения типа T или ссылки на него невозможно при использовании этой модели.
Было бы возможно использовать массив с жесткими размерами, который мог бы быть параметром шаблона. Так что, если вы знаете, что это 4-мерное измерение, вы бы назвали это
MultiDimCollection
и он всегда будет иметь 4 измерения. Затем вы можете заставить оператора [] возвращать MultiDimCollectionReference
это уменьшится до 2 и 1 (вектор), тогда это будет специализировано для возврата скаляра.