gpt4 book ai didi

c++ - 想要 : a C++ template idea to catch an issue, 但在编译时?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:11 25 4
gpt4 key购买 nike

我们有一个常量结构数组,像这样:

static const SettingsSuT _table[] = { {5,1}, {1,2}, {1,1}, etc };

结构如下:

  • size_bytes:
  • num_items:
  • 其他“元数据”成员

所以“总大小”是单个元素的 size_bytes*num_items。所有这些信息都在 const 数组中,在编译时可用。但是,请注意,_table 的总大小与 EEPROM 本身的大小无关。 _table 不镜像 EEPROM,它只描述了布局、用途和我们需要的其他“元数据”类型的信息。但是,您可以使用此元数据来确定我们正在使用的 EEPROM 的数量。

数组简单地描述了存储在外部 EEPROM 中的数据,它具有固定/最大大小。随着功能的添加和删除,const 数组中的条目会发生变化。我们目前对数据的总大小进行运行时检查,以确保它不超过 EEPROM 的大小。

但是,我们已经将其中许多运行时检查更改为 static_assert 样式模板检查,以便构建立即停止。我不是模板专家,所以在这方面需要一些帮助。

所以,问题是:如何创建一个模板来将所有元素的大小相加(将每个元素的值相乘,然后将所有结果相加)然后执行 static_assert 并在超过时停止构建EEPROM 的魔数(Magic Number)大小。我将典型的递归阶乘模板示例视为一种方法,但它无法访问数组,它需要一个常量值(我认为)。

非常感谢您的帮助,

最佳答案

你的问题是它们是常量,但在求值时它们不是常量表达式:

// f is constant, but its value not known at compile-time
int const f = rand() % 4;

您需要的是真正的常量表达式。您可以使用 boost::mpl 组成 mpl 对的 mpl vector ,每个 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<numbers, 0>::type::first::value];

这实际上会使该数组包含 5 个元素。

boost::mpl 引用手册网站:Here

关于c++ - 想要 : a C++ template idea to catch an issue, 但在编译时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com