我们有一个const数组结构,如下所示:
static const SettingsSuT _table [] = {{5,1},{1,2},{1,1}等};
结构有以下几点:
size_bytes:
NUM_ITEMS:
其他"元数据"成员
因此,对于单个元素,"总大小"是size_bytes*num_items.所有这些信息都在const数组中,在编译时可用.但请注意,_table的总大小与EEPROM本身的大小无关._table不镜像EEPROM,它只描述我们需要的布局,用法和其他"元数据"类型信息.但是,您可以使用此元数据来确定我们正在使用的EEPROM数量.
该阵列简单地描述了存储在外部EEPROM中的数据,该外部EEPROM具有固定/最大尺寸.随着功能的添加和删除,const数组中的条目会发生变化.我们目前对数据的总大小进行运行时检查,以确保它不超过EEPROM大小.
但是,我们已将许多这些运行时检查更改为static_assert样式模板检查,以便构建立即停止.我不是模板专家,所以可以在这个上使用一些帮助.
所以,问题是:如何创建一个模板来添加所有元素的大小(乘以每个元素的值,然后添加所有结果),然后执行static_assert并在构建超过幻数大小时停止构建的EEPROM.我把典型的递归因子模板示例看作一种方法,但它无法访问数组,它需要一个const值(我认为).
非常感谢你的帮助,
您的问题是它们是常量,但在评估时它们不是常量表达式:
// f is constant, but its value not known at compile-time int const f = rand() % 4;
你需要的是真正的常量表达式.您可以使用boost::mpl
组成mpl对的mpl向量,每个向量都有一对积分常量:
using namespace boost::mpl; typedef vector< pair< int_<5>, int_<1> >, pair< int_<1>, int_<2> >, pair< int_<1>, int_<1> >, > numbers;
现在,您可以使用boost::mpl
算法迭代它的项目.每个int_
都暴露一个静态int常量value
设置为你告诉它的值.这将评估为一个常量表达式:
// get at the first element of the pair, located in the first element // of the vector. Then get its ::value member. int array[at::type::first::value];
这实际上会使该数组包含5个元素.
boost :: mpl网站参考手册:这里