Могу ли я получить const slice_array от const valarray?

У меня есть функция, которая принимает константную ссылку на valarray, и я хочу иметь возможность разрезать массив и передать срез в другую функцию, которая ожидает const slice_array. Я знаю, что могу просто использовать operator[] и фрагмент, чтобы получить новый скопированный valarray из исходного valarray, но я хочу избежать копирования. Все константно, так что я чувствую, что все должно быть в порядке. Тем не менее, документация для оператора нижнего индекса только для valarray возвращает объекты slice_array при применении к неконстантным valarrays. Это кажется своего рода серьезным недостатком в классе valarray. Я что-то пропустил? Как получить фрагмент const valarray без копирования?

Вот пример того, о чем я говорю:

void foo( const valarray<double> &big_stuff )
{
    const slice_array<double> small_stuff = big_stuff[slice(start, size, stride)];
    bar( small_stuff );
}

Спасибо!

1 ответ

Как получить фрагмент const valarray без копирования?

Там нет никакого способа сделать это, из-за std::valarray не содержат std::slice_arrayдля любого запроса, поэтому он не может дать вам просто ссылку (указатель, ссылку) на std::slice_array что вы просите.

Но std::slice_array может содержать только три машинных слова, трудно представить себе ситуацию, когда не копия std::slice_array можно что-то оптимизировать. Например из gcc/libstdC++ (только данные, функции удалены):

 template<typename _Tp>
  class slice_array {
    const size_t      _M_sz;
    const size_t      _M_stride;
    const _Array<_Tp> _M_array;
  };

где _Array:

template<typename _Tp>
  struct _Array { _Tp* const __restrict__ _M_data; };
Другие вопросы по тегам