我应该如何表示我拥有的元素的连续序列?

时间:2018-10-25 21:36:36

标签: c++ idioms guideline-support-library std-span

我在T *的连续内存中有一堆类型化数据;而且我还知道元素的数量(虽然没什么大不了,但还是个std::size_t

我想使用某种单一类型或数据结构来表示我键入的数据。

现在,我拥有的是用于构造的信息...

  • 一个gsl::span<T>,但拥有所有权。
  • 一个gsl::owner<T *>,但有一个大小。

我将使用哪种类型/结构/容器来表示有关此数据的所有信息?

注意:

  • 显然我可以使用GSL构造; C ++ 2a或Boost中的内容也可以。
  • 我在想ownerspan的嵌合体-也许是gsl::owner<gsl::span<T>>;但我不太喜欢这个主意。

1 个答案:

答案 0 :(得分:2)

您可以继承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::span,从而分割所有权。不确定是赞成还是反对