Re: Использование std:array
От: Сыроежка  
Дата: 01.03.12 08:46
Оценка:
Здравствуйте, Андрей Е, Вы писали:

АЕ>В новом стандарте в библиотеке появилась безопасная обёртка вокруг встроенного массива 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;
}
Меня можно встретить на www.cpp.forum24.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.