尝试理解将值复制到类成员数组的正确方法。目前,我获取数组的每个值并将它们复制到成员数组的相应元素中:
struct IPAddress
{
IPAddress(const unsigned char values[4]) :
values{values[0], values[1], values[2], values[3]}
{
}
const unsigned char values[4];
};
int main(int argc, char** argv)
{
unsigned char values[] = {10, 0, 0, 1};
IPAddress address(values);
return 0;
}
这有效,但有没有办法“自动”复制构造函数中的所有值?我的意思是,如果一个类的值有100个元素而不是4个,我该怎么办?还是1000?
我知道我应该使用std::array
。但由于此代码是为微控制器构建的,因此使用std
库并不是一种选择。
任何参赛者?
答案 0 :(得分:3)
您应该使用std::array
。这是标准库的一部分,不应该冒犯嵌入式编程。
如果您无法访问它,那么实现类似的并不困难。它是一个比原始数组具有更健全语义的直接聚合。它也可能被重用,这使它成为应该实现的实用程序的良好候选者。
如果做不到这一点,你可以依靠委托c'我只在这里为智力练习添加:
struct IPAddress
{
IPAddress(const unsigned char values[4])
: IPAddress(values, std::make_index_sequence<4>{})
{
}
const unsigned char values[4];
private:
template<std::size_t... I>
IPAddress(const unsigned char values[4], std::index_sequence<I...>)
: values{values[I]...}
{
}
};
密钥在包扩展values{values[I]...}
中,它变成了一个与原始扩展器不同的初始化器。 See it live
答案 1 :(得分:2)
我知道我应该使用
std::array
。但由于此代码是为微控制器构建的,因此使用std
库并不是一种选择。
如果您不想加入array
,您仍然可以实施自己的类型来解决问题:
template<typename T, std::size_t N>
class values_t {
public:
values_t(const T *ptr) {
// copy N elements
for (std::size_t i = 0; i < N; ++i)
value[i] = ptr[i]; // copy element
}
T& operator[](int i) { return value[i]; }
const T& operator[](int i) const { return value[i]; }
private:
typename std::remove_const<T>::type value[N];
};
然后,初始化values
的{{1}}数据成员变得更加简单:
IPAddress