我想通过一组可变参数模板参数来描述静态嵌入到程序代码中(最好在ROM部分中)的持久性内存布局(例如Flash或EEPROM设备)的描述,其中在编译时会自动计算必要的偏移量。
目标是创建一个合适的数组初始化器,该初始化器可以在运行时进行迭代,而不会受到限制std::get(std::tuple),而这需要编译时索引。
第一种方法
我创建了一个简单的数据项描述符类,该类将一个特定的ID(应由客户端以枚举类型提供)绑定到数据布局(偏移量和大小):
template
< typename ItemIdType
>
struct DataItemDescBase
{
const ItemIdType id;
const std::size_t size;
const std::size_t offset;
DataItemDescBase(ItemIdType id_, std::size_t size_, std::size_t offset_)
: id(id_)
, size(size_)
, offset(offset_)
{
}
DataItemDescBase(const DataItemDescBase<ItemIdType>& rhs)
: id(rhs.id)
, size(rhs.size)
, offset(rhs.offset)
{
}
};
客户端应使用绑定到特定数据类型和偏移量的此类:
template
< typename DataType
, typename ItemIdType
>
struct DataItemDesc
: public DataItemDescBase<ItemIdType>
{
typedef DataType DataTypeSpec;
DataItemDesc(ItemIdType id_, std::size_t offset_ = 0)
: DataItemDescBase(id_,sizeof(DataTypeSpec),offset_)
{
}
DataItemDesc(const DataItemDesc<DataType,ItemIdType>& rhs)
: DataItemDescBase(rhs)
{
}
};
最后,我想使用a std::array存储具体的数据布局:
const std::array<DataItemDescBase<ItemIdType>,NumDataItems> dataItemDescriptors;
对于客户端,我想从a std::tuple或可变参数模板参数列表中提供一个数组初始化程序,因此,在编译时,将根据前一个元素的offset +大小自动计算后续数组元素的offset。
当前有效的是,客户端可以使用以下代码初始化数组:
namespace
{
static const std::array<DataItemDescBase<DataItemId::Values>,4> theDataLayout =
{ { DataItemDesc<int,DataItemId::Values>
( DataItemId::DataItem1 )
, DataItemDesc<short,DataItemId::Values>
( DataItemId::DataItem2
, sizeof(int))
, DataItemDesc<double,DataItemId::Values>
( DataItemId::DataItem3
, sizeof(int) + sizeof(short))
, DataItemDesc<char[10],DataItemId::Values>
( DataItemId::DataItem4
, sizeof(int) + sizeof(short) + sizeof(double))
} };
}
但是让客户手动计算偏移量看起来容易出错且乏味。
慕的地10843
慕虎7371278
猛跑小猪
相关分类