Как мне представить непрерывную последовательность принадлежащих мне элементов?

У меня есть куча типизированных данных в последовательной памяти, которые я получил как T *; и я также знаю количество элементов (как std::size_t, хотя это не имеет большого значения).

Я хотел бы использовать какой-то один тип или структуру данных для представления моего участка типизированных данных.

Теперь у меня есть информация для построения...

  • gsl::span<T>, но с правом собственности.
  • gsl::owner<T *>, но с размером.

Какой тип/структуру/контейнер я бы использовал для представления всей моей информации об этих данных?

Примечания:

  • Очевидно, я не против использования конструкций GSL; вещи в C++2a или Boost также в порядке.
  • Я думал о химере owner и span - возможно, gsl::owner<gsl::span<T>>; но мне эта идея не очень нравится.

person einpoklum    schedule 25.10.2018    source источник
comment
Вам нужно избавиться от указателя, когда закончите?   -  person NathanOliver    schedule 26.10.2018
comment
Я не понимаю, что вы пытаетесь сделать. Возможно, это злоупотребление языком на уровне Джеймса Коплиена (при условии, что вы читали Advanced C++).   -  person Eljay    schedule 26.10.2018
comment
@NathanOliver: Либо избавьтесь от него, либо верните указатель владельца, либо уникальный указатель и т. д. Но в то же время я могу захотеть передать диапазон владения другим функциям, например. просто-напросто.   -  person einpoklum    schedule 26.10.2018
comment
@Eljay: Предположим, я реализую функцию void process_this_data_and_dispose_of_it(T* ptr, size_t length);   -  person einpoklum    schedule 26.10.2018
comment
Второй вопрос: должен ли это быть стандартный/тип gsl/контейнер? Если нет, я бы просто разветвил span, назвал его owning_span и дал ему деструктор, который очистит указатель.   -  person NathanOliver    schedule 26.10.2018
comment
@NathanOliver: Не должен быть, но я хочу делать то, что делают другие люди, если это вообще обычная ситуация.   -  person einpoklum    schedule 26.10.2018
comment
gsl::owner<gsl::span<T>> терпит неудачу, потому что владелец проверяет std::is_pointer на свой аргумент   -  person Caleth    schedule 26.10.2018


Ответы (1)


Вы можете унаследовать gsl::span<T> и владеть std::unique_ptr<T[]>

template <typename T, typename D = std::default_delete<T>>
struct owning_span : public gsl::span<T>
{
    owning_span() {}
    owning_span(T* ptr, index_type size, D d = {}) : span(ptr, size), m_ptr(ptr, std::move(d)) {}
    owning_span(T* first, T* last, D d = {}) : span(first, last), m_ptr(first, std::move(d)) {}
    // other constructors ?
private:
    std::unique_ptr<T[], D> m_ptr;
};

Одно замечание: вы все еще можете скопировать конструкцию/назначить gsl::spans из этого, отрезав право собственности. Не уверен, что это за или против

person Caleth    schedule 25.10.2018
comment
Возможно, сделать конструкторы T* явными и иметь неявный конструктор, принимающий owner<T*> , и один, принимающий unique_ptr<T[]>? Кроме того, метод (ы) освобождения права собственности. Но это не наполовину плохо. - person einpoklum; 26.10.2018