Основы создания п-мерного сбора будет что-то вроде этого. Предполагается, что контейнер не может быть перенастроен.
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 перегрузки, одна константа и одна неконстантная, а в() будут проверяться границы, пока оператор [] не будет. Вероятно, вам понадобится одна вспомогательная (не шаблонная) функция для вычисления местоположения этого элемента в вашем векторе данных.
Конечно, создание вектора является многоэтапным процессом, поэтому вы можете использовать какой-либо магический класс для его создания.
Вы также можете иметь оператор [] для вашего контейнера, который возьмет один размер_t и вернет объект ContainerReferencer. Это не реальный многомерный массив, а фрагмент данных, хранящихся в других местах. Еще раз могут быть константные или неконстантные версии.
Получение множественных вызовов оператора [] для фильтрации до значения типа T или ссылки на него невозможно с использованием этой модели.
Было бы возможно использование жесткого массива, который мог бы быть параметром шаблона. Так что, если вы знаете, что это 4-х размеров вы могли бы назвать его
< MultiDimCollection двойной, 4>
и он всегда будет иметь 4 измерения. Затем вы можете получить оператор [], чтобы вернуть MultiDimCollectionReference < double, 3>
это будет идти до 2 и 1 (вектор), тогда это будет специализировано для возврата скаляра.
Кстати, зачем вам нужен такой контейнер? Как насчет рассмотрения boost :: array или boost :: multi_array? – upriser 2010-11-22 17:27:07