Mat*_*man 4 c++ templates static-assert
我们有一个const数组结构,如下所示:
static const SettingsSuT _table [] = {{5,1},{1,2},{1,1}等};
结构有以下几点:
因此,对于单个元素,"总大小"是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;
Run Code Online (Sandbox Code Playgroud)
你需要的是真正的常量表达式.您可以使用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;
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用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<numbers, 0>::type::first::value];
Run Code Online (Sandbox Code Playgroud)
这实际上会使该数组包含5个元素.
boost :: mpl网站参考手册:这里
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |