【问题标题】:long std::initializer_list with many elements for testing带有许多用于测试的元素的长 std::initializer_list
【发布时间】:2017-04-19 09:08:52
【问题描述】:

我的类需要对其数据成员之一的元素数量施加上限,该成员恰好是一个容器。

我的类的一个构造函数将 std::initializer_list 作为参数来初始化该容器数据成员。

单元测试需要验证上限是否到位。为此,我需要尝试使用包含 1025 个元素的初始化列表来调用我的构造函数。

有没有比在测试代码中包含 1025 个元素的花括号文字列表更好(= 更易读)的方法来创建这个 1025 元素的初始化器列表?

(元素的数据类型总是无符号短(uint16_t),我的类不是模板。)

【问题讨论】:

  • 您可以使类成为具有最大元素数的模板作为唯一的模板参数(默认为 1024),但测试较小的数字(例如 4),此时您只需要 std::initializer_list 5 个元素,而不是 1025 个。
  • 有趣。我对此有一点不好的感觉,因为严格来说,我将验证另一个类(或模板实例化)的行为,而不是我在生产中实际使用的类。但是需要考虑一些事情。
  • 您可以使用模板规范在编译时生成 1024 个元素。
  • @TomazCanabrava 如果您知道这是如何完成的,并且它比长长的文字列表更具可读性,那么请将其作为答案发布
  • 这些数字有什么意义,还是可以随机生成的?

标签: c++ c++11 initializer-list stdinitializerlist


【解决方案1】:

如果您使用模板递归或花哨的“重复”宏,您可能会受到静态递归限制的影响,这将使您的实现变得比平时更加​​复杂。

考虑到这一点,我认为最简单和最好的方法就是定义一些嵌套宏,即

#define ZEROS_10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
#define ZEROS_50 ZEROS_10, ZEROS_10, ZEROS_10, ZEROS_10, ZEROS_10
#define ZEROS_250 ZEROS_50, ZEROS_50, ZEROS_50, ZEROS_50, ZEROS_50
#define ZEROS_1K ZEROS_250, ZEROS_250, ZEROS_250, ZEROS_250

FooType f{ ZEROS_1K, ZEROS_10, ZEROS_10, 0, 0, 0, 0, 0 };

【讨论】:

  • 看起来不错。简单,可读性强,达到预期效果。谢谢!
猜你喜欢
  • 2020-09-16
  • 2015-02-14
  • 2020-07-06
  • 1970-01-01
  • 2012-04-09
  • 2017-11-30
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多