我需要创建一个 C++ 元编程 DSL/API 来描述通用数据布局。我希望静态初始化数据结构描述(即没有动态内存分配,最好在 ROM 部分分配)。
我对 C++11 的特性还不是很熟悉,但我知道你可以比提供的旧标准做更多的初始化(静态)。
我正在寻找一种解决方案,使客户可以轻松地使用某种“基本”来描述数据布局,DataItemDescriptor
如下所示:
template
< typename ItemIdType
, typename OffsetType = unsigned int
>
struct DataItemDescBase
{
const ItemIdType id;
const OffsetType offset;
const size_t size;
DataItemDescBase(ItemIdType id_, OffsetType offset_, size_t size_)
: id(id_)
, offset(offset_)
, size(size_)
{
}
};
template
< typename DataType
, typename ItemIdType
, typename OffsetType = unsigned int
>
struct DataItemDesc
: public DataItemDescBase<ItemIdType,OffsetType>
{
typedef DataType DataTypeSpec;
typedef ItemIdType IdTypeSpec;
DataItemDesc(ItemIdType id_, OffsetType offset_)
: DataItemDescBase(id_,offset,sizeof(DataTypeSpec))
{
}
};
并使用 s.th. 喜欢
enum MyDataItemId
{
MyDataItem1 ,
MyDataItem2 ,
MyDataItem3 ,
}
std::array<DataItemDescBase<MyDataItemId>,3> dataLayoutDesc =
{ add_dataitem_desc<int>(MyDataItem1) ,
add_dataitem_desc<unsigned short>(MyDataItem2) ,
add_dataitem_desc<char[15]>(MyDataItem3) ,
};
让客户端定义它的具体数据布局结构(请注意,我打算在编译期间也以某种方式计算必要的偏移值)。
我认为可以使用一些额外的静态检查(以及来自客户端的“绑定”定义)来提供 id 及其关联类型相关性的类型安全。这是我在一些不同的背景下已经意识到的。
谁能引导我走向正确的方向或展示示例如何使用 C++11 初始化功能和元编程技术来做到这一点?