c++ - 单线捷径,用于将列表重新分配给阵列

标签 c++ c++17

如何使用C++ 17功能优雅地简化(或消除)下面代码中的for loops

#pragma pack(push, 1)
        typedef struct ethernet_frame
        {
            unsigned char   dst[6]; 
            unsigned char   src[6]; 
            unsigned short  proto;
        } ethernet_frame, *ethernet_frame_ptr;
#pragma pack(pop)

        int i;
        ethernet_frame eFrame = { {00,00,00,00,00,00}, {42, 54, 33, 67, 14, 88}, 0x800 };
        ProcessFrame(&eFrame); //A library function expecting an address of an ethernet_frame with its strict bit layout

        i = 0;
        for (unsigned char c : { 36, 84, 23, 77, 35, 11 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        i = 0;
        for (unsigned char c : { 65, 23, 74, 82, 20, 94 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        i = 0;
        for (unsigned char c : { 47, 22, 86, 45, 33, 38 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        // etc...

eFrame.Dst = { 47, 22, 86, 45, 33, 38 }这样的重新分配会很整洁...但它们是非法的:(

最佳答案

如果您不能将struct ethernet_frame更改为使用std::array,那么尽管安全性较低,但仍然可以使用多个单行复制数据。首先,使用旧的memcpy():

#include <cstring>
...
memcpy(eFrame.dst, std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}.begin(), std::size(eFrame.dst));

或使用std::copy_n():
#include <algorithm>
...
std::copy_n(std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}.begin(), std::size(eFrame.dst), eFrame.dst);

使用Ranges TS,您可以避免必须指定要复制的数据的大小:
#include <experimental/ranges/algorithm>
...
std::experimental::ranges::copy(std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}, eFrame.dst);

同样,如果没有一个衬里要使用多个对象,那么您当然可以总是自己编写一个函数,将问题变成一个衬里。

关于c++ - 单线捷径,用于将列表重新分配给阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59510247/

相关文章:

c++ - 我可以执行获取我的 `std::future` 并等待它吗?

c++ - 通过其接口(interface)访问可变参数模板结构

c++ - 使用 dll 库时,是否需要包含用于构建 dll 的所有头文件?

c++ - 没有匹配的函数来调用 QLinEedit

c++ - 使用 const T & 和 T&& 两种类型的参数实现一个函数

c++ - 如何测试 C++ 的功能支持?

c++ - 在使用自定义弱指针的一对多关系中清除 nullptr

c++ - 如何开始学习 MinGW C++?

c++ - 检查 C++ 中的值定义

c++ - 使用可变参数模板帮助程序进行多个 std::variant 访问