Повышение вложенности :: multi_array?

У меня есть шаблонный класс, который выполняет некоторые вычисления и возвращает multi_array, немного упрощенный, например:

template <typename T>
class C
{
public:
typedef boost::multi_array<T, 2> result_type;

void do_something(T const& data, unsigned i, unsigned j); // add result to R[i][j]

result_type R;
};

Создание класса с простым типом T=double работает отлично. Теперь я хочу создать экземпляр с «T=boost::multi_array<double, 1>«, но такой, что тип результата boost::multi_array<double, 3>,

Определение multi_array<multi_array<T, N>, M>> явно не приводит к multi_array<T, N+M>, это просто N-мерный multi_arrays с элементами, являющимися M-мерными multi_arrays …

Идея создания такого типа мотивирована руководством Boost, которое говорит:

MultiArray рекурсивно определен; контейнеры на каждом уровне
модель иерархии контейнера MultiArray, а также.
Собственно, получается, что «элементы» промежуточного multi_array уровни имеют тип subarray,

Можно ли использовать subarray генерировать multi_array тип с эффективной размерностью N+M? Может быть, как-то по следующим направлениям:

typedef typename boost::multi_array<double, 3>::subarray<1>::type value_type;
boost::multi_array<value_type, 2> a;

Я ищу относительно чистое решение (не долгий взлом), если это невозможно с интерфейсом multi_array, я лучше переосмыслу дизайн того, что я собираюсь реализовать.

1

Решение

Я думаю, что нет смысла создавать экземпляры multi_array с элементами типа multi_array (хотя это может скомпилироваться). Например, это не приведет к непрерывному расположению памяти, поскольку элементы сами управляют памятью.

Чтобы решить проблему, которая мотивировала мой вопрос, я предложил следующее решение:

template <typename T>
class C
{
enum { extra_rank = get_rank<T>() };
public:
typedef boost::multi_array<T, 2 + extra_rank> result_type;
}

Класс определяет multi_array с дополнительными размерами в зависимости от типа T, Вспомогательная функция get_rank проверяет, T является multi_array и возвращает его dimensionalityв противном случае возвращается 0.

0

Другие решения

Других решений пока нет …