我编写了一个自定义数组容器,因为大多数 C++ 库(包括 std::array
和 std::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/