Здравствуйте, Андрей Е, Вы писали:
АЕ>В новом стандарте в библиотеке появилась безопасная обёртка вокруг встроенного массива std::array. Сделано вроде как просто и эффективно. Даже инициализировать его можно так же как встроенный массив.
АЕ>Всё бы хорошо, но есть одна проблема. Этот шаблонный класс требует два параметра: тип хранимого значения и размер. И если я хочу например передать array в фукнцию, даже по ссылке или указателю, я должен в типе аргумента функции указать оба параметра шаблона: тип и размер.
АЕ>Пример:
АЕ>АЕ>#include <iostream>
АЕ>#include <array>
АЕ>void f(const std::array<int, 5>& x) {
АЕ> for (int y : x)
АЕ> std::cout << y << ", ";
АЕ> std::cout << '\n';
АЕ>}
АЕ>int main() {
АЕ> std::array<int,5> a={1,2,3};
АЕ> f(a);
АЕ> return 0;
АЕ>}
АЕ>
АЕ>Это очень неудобно: нужно плодить волшебную константу везде, где используется массив и заменять ее ручками когда в массив добавляется ещё одно значение. При этом в функции эта константа никак не используется.
АЕ>Подскажите пожалуйста, можно ли как-то обойти эту проблему?
Вы можете работать с ним точно также, как вы работаете с массивами в С, то есть испольуя указатель на первый элемент массива, который получается с помощью функции члена класса
data, и размер массива, который получается с помощью функции члена класса
size.
например,
#include <iostream>
#include <array>
#include <algorithm>
void f( const int a[], size_t n )
{
std::for_each( a, a + n,
[]( int x ) { std::cout << x << ", "; } );
std::cout << std::endl;
}
int main()
{
std::array<int,5> a={1,2,3};
f( a.data(), a.size() );
return 0;
}