У меня есть шаблонный класс, который выполняет некоторые вычисления и возвращает 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, я лучше переосмыслу дизайн того, что я собираюсь реализовать.
Я думаю, что нет смысла создавать экземпляры 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.
Других решений пока нет …