c++ - 单元测试自定义 STL 兼容的容器和迭代器
问题描述
我刚刚为自定义容器实现了自定义迭代器类型。容器对 C++17 ReversibleContainer建模,其迭代器(const 和非 const)建模LegacyRandomAccessIterator。
我的问题是;是否有某种内置的东西std
可以用来测试容器及其迭代器是否都符合指定的命名要求,或者我是否必须自己编写所有测试(这对我来说大部分是可行的,但我d宁愿不重新发明轮子;而且我不确定我是否有足够的模板向导来真正彻底地证明例如类型等是正确的)?
诸如(我知道这是其中之一)之类的事情,例如来自以下操作语义operator <
:
custom_container::iterator a = ...;
custom_container::iterator b = ...;
assert((a < b) == (b - a > 0));
并且返回类型是正确的,等等,等等。
我已经设法找到了一些功能,例如<type_traits>有一些有用的实用程序,例如:
if (!std::is_copy_constructible<custom_container::iterator>::value)
/* fail test */ ;
这至少对一些基本的命名需求是有好处的。
解决方案
不,我们没有。
事实上,证明一个类型满足作为迭代器的所有要求不能在 C++ 中静态完成。
您可以静态测试类型是否正确,并且存在运算符等。但是这种语义无法在一般情况下得到证明(我认为由于赖斯定理,无论是在实践上还是理论上)。
我发现大多数需求在实践中都很容易检查(如果不那么容易自动化的话)。我发现的最常见的问题是,比输入迭代器更强的“遗留”迭代器必须具有它们返回引用和指针的实际支持持久数据;该数据不能存在于迭代器中,或者是临时/生成的。
推荐阅读
- javascript - 时间到时如何调用提交按钮
- laravel - 你如何将你的 melihovv Cart 与 Laravel 7 中的模型相关联?
- sql-server - 使用 SUM 进行递归周初查询
- c++ - 如何使用 javac 而不是 javah 使用 Eclipse 创建 c++ JNI 标头
- r - 从数据框中提取轮廓顶点
- c - 打印所有输入字符组合的功能未按预期打印
- flutter - 如何在颤动中显示 x 个小部件
- firebase - Flutter 中的 StreamBuilder 卡在 ConnectionState.waiting 中并且只显示加载标记
- r - R计算RGB代码与数据帧中的值成比例
- python-3.x - .format 占位符和 .CSV 字段