c++ - 初始化自定义数组类而不创建拷贝

标签 c++ arrays templates c++11

我编写了一个自定义数组容器,因为大多数 C++ 库(包括 std::arraystd::iterator)不适用于目标(嵌入式)。模板类主要按预期工作。
但是我没有设法设置一个构造函数,它可以在不创建拷贝的情况下初始化整个数组。我尝试了几种构造函数,包括通过引用传递。如果传递的数组的大小与我类(class)的不匹配,则显示的将创建一个拷贝并且会出现问题。

环境支持最高 C++11 的语言功能,但没有可用的标准库。因此 similar questions 的答案无法使用。

模板类源码:

template<typename T, typename sizetype, sizetype SIZE>
class mArray
{
private:
    T _elements[SIZE]; ///< Array of SIZE elements of Type T
    static_assert( SIZE > 0, "Size must be > 0"); // Discourage empty array
public:
    mArray(){};
    mArray(T initArr[SIZE])
    {
        sizetype index = 0;
        for (auto element : _elements)
        {
            _elements[index] = initArr[index]; //
            ++index;
        }
    }
    T* begin()
    {
        return &_elements[0]; // Pointer to first _element
    }
    T* end()
    {
        return &_elements[SIZE]; // Pointer behind last _elements
    }
    T front()
    {
        return _elements[0]; // Return first element of _elements
    }
    T back()
    {
        return _elements[SIZE-1]; // Return last element of _elements
    }
    T at(sizetype pos)
    {
        static_assert( pos > SIZE, "pos must be < SIZE");
        return _elements[pos];
    }
    T operator[](sizetype pos)
    {
        return _elements[pos];
    }
    T* data()
    {
        return *_elements;
    }
    sizetype size()
    {
        return SIZE;
    }
};

如何改进构造函数以避免创建拷贝?

最佳答案

完成此操作的方式涉及聚合初始化。如果您试图获取一个数组并从中复制,那当然需要拷贝。然而,如果你被传递给一个初始化列表,那么你只需要公开 elements 并使用 std::array 语法:

template<typename T, typename sizetype, sizetype SIZE>
class mArray {
 public:
  T elements_[SIZE];
  static_assert( SIZE > 0, "Size must be > 0");
  T operator[](sizetype pos) { // you sure about this?
    return elements_[pos];
  }

  // other member functions
};

int main() {
  mArray<int, std::size_t, 10> arr{{1, 3, 5, 7}};
}

关于c++ - 初始化自定义数组类而不创建拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501941/

相关文章:

c++ - 如何将数组的每个n个元素组合成一个元素

c++ - 即使已经包含了类的标题,也被迫使用前向声明

C++:临时参数的生命周期?

c++ - 专门化 hashmap 模板

c++ - 使用专门的模板并命名枚举选项

c++ - 观看来自可执行文件的指令?

java - 找到将给出数组中最大数字的数字顺序

arrays - 如何在数组中查找连通分量

python - 二维数组/字典组合

c++ - 为什么我的模板函数不能内联