当前位置:  开发笔记 > 编程语言 > 正文

想要:一个C++模板想法来解决问题,但是在编译时?

如何解决《想要:一个C++模板想法来解决问题,但是在编译时?》经验,为你挑选了1个好方法。

我们有一个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值(我认为).

非常感谢你的帮助,



1> Johannes Sch..:

您的问题是它们是常量,但在评估时它们不是常量表达式:

// 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网站参考手册:这里

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有