Арифметика указателей с array_view

Я только что видел первую часть книги Херба Саттера «Написание хорошего C ++ 14 … по умолчанию» (https://www.youtube.com/watch?v=hEx5DNLWGgA) и у меня есть (возможно глупый) вопрос относительно array_view.

Представленный случай отправлял array_view вместо указателя и длины, чтобы избежать арифметики указателя, но как может array_view обрабатывать такой случай:

int vec[10];
func(vec+2, 5); //start from the 2nd element and process 5 of them

Поддерживает ли array_view такие вещи, или я просто неправильно понял вариант использования?

1

Решение

С string_view вы можете сделать это:

const char* str = "hello world!";
func(std::experimental::string_view(str + 2, 5));

То есть используйте один из конструкторов представления, чтобы построить его из подстроки.

Так с array_view вы, вероятно, сможете сделать это:

int vec[10];
func(std::experimental::array_view(vec + 2, 5));

Заметка: Там, кажется, нет никакого официального array_view с ++ 14.

1

Другие решения

Прежде всего, вы можете получить слайды от репозиторий cppcon’s Github.

Как вы можете видеть в #8 а также #10Вы можете написать следующее:

Запустите онлайн!

// http://llvm.org/apt/
// sudo apt-get install clang-3.6 lldb-3.6 libc++-dev libc++abi-dev
// clang-3.6 -stdlib=libc++ -std=c++14 main.cpp -lc++ -lc++abi

#include <array>
#include <vector>
#include "array_view.h"  // https://github.com/Microsoft/GSL

void func(gsl::array_view<int> av)
{
// ...
}

int main()
{
{
int vec[10];
func(vec);
//func(vec, 5);    // syntax error (func expects exactly 1 argument)
func({vec, 5});    // notice the curly braces
func({vec+2, 5});
}

{
std::vector<int> vec;
func(vec);
}

{
size_t len = 10;
int* p = new int[10];
func({p,len});
// remember to delete[] p
}

{
std::array<int, 2> arr;
func(arr);
}
}

И это имеет смысл. Если вы посмотрите на array_view.h, вы увидите все array_viewконструкторы:

constexpr array_view(pointer ptr, bounds_type bounds)
constexpr array_view(T * const & data, size_type size)
constexpr array_view(T(&arr)[N], size_type size)
constexpr array_view (const std::array<std::remove_const_t<value_type>, N> & arr)
// ...
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector