C++将模板映射到其他模板,然后映射到元组



我正在研究一些低级驱动程序,我想我会使用C++模板来增加趣味。

在 Verilog 中,您可以使用[h:l]表示法定义位掩码,其中h是高位,l是低位。我已经为此定义了数据结构:

uint16_t mask(uint8_t h, uint8_t l) {
return h << 8 + l;
}

我想记住这些位掩码。假设我想修改寄存器 R 的位 [7:4],如果我事先已经在 R 中读取,我可以在写入之前修改 R 的旧值,而不是向我的设备发送新的读取请求。

要找到每个记忆所需的字节数,我已经有一个函数

constexpr uint8_t requiredBytes(uint16_t mask)

返回保持掩码所需的字节数。

有没有办法静态时间声明一个记忆缓冲区以便于分析?(这将在嵌入式平台上运行)

我假设我需要如下所示的管道:

template <uint16_t... masks>
(1) V
Apply requiredBytes() to each mask in the template
(2) V
Convert each value from requirdBytes to a type (requiredBytes() = 1 => uint8_t, ...)
(3) V
Convert this list of types into a std::tuple<>

我知道我可以使用一系列模板专用化进行转换 2,这导致了我的问题,我们如何实现转换 1 和 3?

我认为您的第 2 步(您描述为已经完成的交易)类似于

typename bytesType<n>::type

其中模板参数n是字节数,这通过适当的专用化为您提供类型。如果是这样,那么这似乎是一个简单的包扩展:

template <uint16_t ...masks>
using tuple_mask=std::tuple<typename bytesType<requiredBytes(masks)>::type...>;

requiredBytes()是一个 constexpr,这将提供参数bytesType,这为您提供了类型。然后,打包扩展它,并将其输入到std::tuple声明中。

相关内容

最新更新