Вы можете инкапсулировать создание массива в вспомогательную функцию:
template <typename T, size_t N>
boost::multi_array<T, N> make_regular_matrix(const size_t m)
{
boost::multi_array<T, N> arr;
boost::array<size_t, N> extents;
extents.assign(m);
arr.resize(extents);
return arr;
}
const int n = 3;
int size = 4; // Can be const as well, but this is not mandatory
auto arr = make_regular_matrix<char, n>(size);
Если вы не можете использовать auto
, вам придется продублировать параметры шаблона:
boost::multi_array<char, n> arr = make_regular_matrix<char, n>(size);
Функция make_regular_matrix
может быть сокращена до использования std::vector
, как вы сделали в своем ответе;Я не знаю, будет ли эта реализация лучше.Цель вспомогательной функции - скрыть создание массива, но могут быть написаны другие версии, например, для инициализации элементов массива с заданным значением:
template <size_t N, typename T> //switched order for deduction
boost::multi_array<T, N> make_regular_matrix(const size_t m, const T & value)
{
boost::multi_array<T, N> arr(std::vector<size_t>(n, m));
std::fill(arr.data(), arr.data() + arr.num_elements(), value);
return arr;
}
auto arr = make_regular_matrix<4>(3, 'z'); //creates a 3x3x3x3 matrix
//filled with 'z's