繁体   English   中英

C ++使用固定大小的数组成员对struct进行初始化

[英]C++ brace initialization of struct with fixed size array member

考虑以下结构:

struct IPv6Address {
    uint8_t x[16];

    uint8_t& operator[](size_t pos) { return x[pos]; }
    uint8_t* bytes() { return x; }
}

static const IPv6Address WELL_KNOWN_ADDRESS =       //ff02::1
    {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};

像这样的Brace初始化工作正常。 但是一旦我添加了一个构造函数,初始化就不再起作用了。 除了大括号初始化之外,我还想要这个构造函数:

IPv6Address(uint8_t bytes[16]) { memcpy(x, bytes, sizeof(x)); }

一旦我添加自己的构造函数,显然没有隐式定义构造函数。 但是,如何在这种情况下重新定义大括号初始化或强制编译器创建所有默认构造函数?

额外要求:我无法使用stdlib,因为我正在为嵌入式应用程序编程

您可以在现有构造函数中使用双重支撑列表(当不允许使用initialiter_list时)

static const IPv6Address WELL_KNOWN_ADDRESS =  
{{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}};

使用带有initializer_list的构造initializer_list

以下构造函数应该完成这项工作(没有测试它)

IPv6Address(std::initializer_list<uint8_t> c) : x{} {
  assert(c.size() <= std::size(x));
  std::copy(c.begin(), c.end(), x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM