我用constexpr
拷贝构造函数编写了一个类。 (这是一个结构,使其更简单。)其中一个字段是一个数组。我也要复制它。
struct Foo
{
static constexpr int SIZE = 4;
constexpr Foo() = default;
constexpr Foo(const Foo &foo) :
arr{foo.arr[0], foo.arr[1], foo.arr[2], foo.arr[3]},
bar(foo.bar+1) {}
int arr[SIZE] = {0, 0, 0, 0};
int bar = 0;
};
我的版本有效,但不可扩展。如果我改变SIZE
,我必须修改构造函数。另外,代码看起来很难看。
在构造函数中复制数组是否有更好的方法?构造函数必须是constexpr
。
答案 0 :(得分:3)
您可以使用std :: array。由于它是一种聚合类型,我相信这会起作用。
答案 1 :(得分:3)
在C ++ 14中,您只需使用循环来复制数组:
constexpr Foo(const Foo &foo)
: bar(foo.bar + 1)
{
for (int i = 0; i < SIZE; ++i)
arr[i] = foo.arr[i];
}
这并不意味着你应该这样做。我建议改用std::array
。例如,如果arr
是一个具有非平凡初始化的某个类类型的数组,它将被默认初始化然后被复制,从而浪费性能,而不是使用std::array
时的复制初始化和默认值复制构造函数。
答案 2 :(得分:2)
你可以像在C ++ 11中那样只复制数组
template <int LENGTH>
constexpr bool copy_array(const char (&from)[LENGTH + 1], char (&to)[LENGTH], int index)
{
return index < LENGTH ? (to[index] = from[index], copy_array(from, to, ++index)) : false;
}
constexpr char src[] = "ab";
char dest[2];
copy_array(src, dest, 0);
编辑: 在您的上下文中,您可以执行以下操作:
#include <iostream>
#include <type_traits>
#include <array>
#include <utility>
struct Foo
{
static constexpr int SIZE = 4;
constexpr Foo() = default;
constexpr Foo(const Foo &foo) :
arr{foo.arr},
bar(foo.bar + 1) {}
std::array<int, SIZE> arr = {{0, 0, 0, 0}};
int bar = 0;
};
int main()
{
constexpr Foo foo1;
constexpr Foo foo2(foo1);
std::cout << foo1.bar << std::endl;
std::cout << foo2.bar << std::endl;
return 0;
}