Catch2中与std::nullopt比较报错信息不可读,如何解决?
Catch2测试std::optional时错误提示不清晰的解决办法
是的,这是因为Catch2默认未为std::optional类型提供格式化器,无法正确解析并展示其实际值,才会出现{?} == {?}的模糊报错。
解决方法有两种:
手动注册std::optional格式化器(适用于Catch2 v2版本)
在测试代码中添加自定义格式化器,让Catch2能正确输出std::optional的内容:#include <catch2/catch_all.hpp> #include <optional> namespace Catch { template<typename T> struct StringMaker<std::optional<T>> { static std::string convert(const std::optional<T>& opt) { if (!opt) { return "std::nullopt"; } else { return "std::optional{" + StringMaker<T>::convert(*opt) + "}"; } } }; } // namespace Catch添加后,测试失败时会显示类似
std::optional{42} == std::nullopt的清晰提示。升级到Catch2 v3版本
Catch2 v3已内置对标准库类型(包括std::optional)的格式化支持,无需额外编写代码,升级后即可自动显示正确的错误信息。
内容的提问来源于stack exchange,提问作者Nane
相关产品推荐
相关产品推荐

