所有重要的已经说过了,你只需要让这个函数更加灵活:
template <typename T, size_t N>
std::array<T, N> copyarray(T const (&input)[N])
{
std::array<T, N> result;
std::copy(std::begin(input), std::end(input), std::begin(result));
return result;
}
(晚些时候)编辑:上述方法存在一个缺点:您需要在分配时复制返回的数组,因为它不包含任何真正可移动的数据(原始数组也是如此)。您可以通过直接复制到目标数组来避免这种缺点:
template <typename T, size_t N>
void copyarray(std::array<T, N>& target, T const (&source)[N])
{
std::copy(std::begin(source), std::end(source), std::begin(target));
}
这个函数模拟了赋值操作target = source
; 当然,如果你喜欢,可以交换参数,使输出参数位于最后。
用法(如下):
int source[7] = { };
std::array<int, sizeof(source)/sizeof(*source)> target;
copyarray(target, source);
int *input
。 - Slavastd :: begin
重载接受指针类型。 - Ronstd::memcpy(result.data(), input, sizeof(input));
在它们之间进行复制。将两个数组的大小定义为相同的constexpr size_t
值可能是一个好习惯。如果在多个地方重新输入16
,并且它们不同步,那么就会发生缓冲区溢出或下溢。 - Davislor