c++ - 如何在不制作额外副本的情况下从 sockaddr_in6 创建 boost::asio::ip::address_v6?
问题描述
问题是address_v6
类严格接受原始数据作为bytes_type
类:
typedef array< unsigned char, 16 > bytes_type;
但是sockaddr_in6
struct 没有,它有 C 风格的数组,如果std::array
不复制就无法转换。所以我必须创建一个std::array
,在那里复制数据,并将该数组传递给address_v6
,它将数据从该数组复制std::array
到其内部缓冲区。
我希望我可以使用或实现一些 C 风格的数组查看器类,但无论如何我都无法将它传递给构造函数,因为它不是模板函数。
有什么方法可以在address_v6
不制作额外数据副本的情况下创建一个?
解决方案
必须是包含原始数组作为其第std::array
一个也是唯一一个非静态数据成员的结构。由于原始数组包含unsigned char
s,因此它是标准布局类。因此,我无法从标准中找到以下代码不起作用的原因:
auto& bytearray = reinterpret_cast<std::array<unsigned char,16>&>(ipv6socket->sin6_addr.s6_addr);
如果要复制,请替换auto&
为纯文本。auto
推荐阅读
- c++ - 使用python api在gdb中列出值的成员
- javascript - 返回一个 Promise,因为异步函数默认返回一个 Promise
- azure - 我对 Azure 警报的使用有什么问题?
- vulkan - Linux 上的哪些 AMD GPU 支持 VK_KHR_ray_tracing_pipeline?
- c# - 为什么没有更新箭头绘制状态的事件?
- html - 将 ng-template 与标签本身分离到其单独的组件中
- google-cloud-platform - 您的项目因违反我们的服务条款(GCP 错误)而被暂停进行加密货币挖掘
- python - 为什么我无法在我的 centos 上安装 dlib 库?
- flutter - 当键盘在 textfeild 单击时打开时,堆栈内的底部容器向上移动 - Flutter
- html - 在 iOS 上调整了一个复选框