实现不复制元素的初始化列表构造函数

时间:2018-11-07 07:14:40

标签: c++ c++14 initializer-list

我有一个小Slice类,用于需要获取项目“列表”的函数。它不存储任何项目,而只是一些现有列表的视图。

#include <initializer_list>

template<typename T>
struct Slice
{
    u32 length;
    T*  data;

    Slice(T& element) { length = 1; data = &element; }

    template<typename T, u32 Length>
    Slice(T(&arr)[Length]) { length = Length; data = arr; }

    inline T& operator [](u32 i) { return data[i]; }
};

我正在尝试从初始化列表中进行构造。像这样

Slice<i32> indices = { 0, 1, 2, 2, 3, 0 };

所以我尝试添加一个带有initializer_list的构造函数

    template<typename T>
    Slice(std::initializer_list<T> initList) { length = initList.size(); data = (T*) initList.begin(); }

但是,我认为这是错误的形式,因为initializer_list是一个临时值,在分配后将超出范围。此外,Slice数据并非严格为const,并且似乎initializer_lists是。

是否有实现此行为的正确方法?

1 个答案:

答案 0 :(得分:0)

您肯定要复制这些临时文件。在这种情况下,您可以使用动态分配和标志来表明所有权:

template<typename T>
struct Slice
{
private:
    u32 length;
    T*  data;
    bool owns= false;

public:
    Slice(T& element) { length = 1; data = &element; }

    template<u32 Length>
    Slice(T(&arr)[Length]) { length = Length; data = arr; }

    Slice(std::initializer_list<T> initList): length(initList.size()), owns(true)
      { data= new T[length]; std::copy(initList.begin(),initList.end(),data); }

    ~Slice() { if (owns) delete[] data; }

    inline T& operator [](u32 i) { return data[i]; }
};