2

我需要创建一个 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 初始化功能和元编程技术来做到这一点?

4

0 回答 0