c++ - 如何制作 boost.Test 日志/打印标准类型

标签 c++ boost c++17 boost.test

#include <boost/test/included/unit_test.hpp>


BOOST_AUTO_TEST_CASE(test1)
{
    std::optional<int> opt1(10);
    BOOST_TEST(t == 11);

    std::optional<long> opt2(11);
    BOOST_CHECK_EQUAL(opt1, opt2);
}

有没有什么方法可以进行boost测试打印(在代码中:BOOST_TEST)std类型?重载 operator<<必须在命名空间 std 中由 ADL 找到并扩展 std是禁止的。 boost's documentation中唯一提到的东西是关于 UDT 的,解决方案也依赖于 ADL,因为它强调添加自定义函数 boost_test_print_type在与 UDT 相同的命名空间中。

关于建议的拷贝

我不确定。一式两份提出的薄 wrapper 将如何工作?这是否意味着我必须在每个断言之前转换为每个测试用例中的包装器,而不是直接使用标准类型(可选)?如果是这样,那不是我要找的,也不是我想要的!

最佳答案

这是一个基于包装器模板的解决方案。我认为这远非理想,但它应该按预期工作。

template <class T>
struct PrintableOpt {
    std::optional<T> value;
};

必要的运算符重载是

template <class T>
std::ostream& operator << (std::ostream& os, const PrintableOpt<T>& opt)
{
    if (opt.value)
        return os << *opt.value;
    else
        return os << "std::nullopt";
}

template <class T, class U>
bool operator == (const PrintableOpt<T>& lhs, const PrintableOpt<U>& rhs)
{
    return lhs.value && rhs.value && *lhs.value == *rhs.value;
}

template <class T, class U>
bool operator != (const PrintableOpt<T>& lhs, const PrintableOpt<U>& rhs)
{
    return !(lhs == rhs);
}

为了方便起见,这里有两个帮助函数来构造包装器实例:

template <class T>
auto printable(T&& opt)
{
    return PrintableOpt<T>{std::forward<T>(opt)};
}

template <class T>
auto printable(std::optional<T>& opt)
{
    return PrintableOpt<T>{opt};
}

测试现在看起来像这样:

BOOST_AUTO_TEST_CASE(test1)
{
    std::optional<int> opt1(10);
    BOOST_TEST(printable(opt1) == printable(11));

    std::optional<long> opt2(11);
    BOOST_CHECK_EQUAL(printable(opt1), printable(opt2));
}

关于c++ - 如何制作 boost.Test 日志/打印标准类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531440/

相关文章:

c++ - 返回对重载私有(private) & 运算符的类的引用?

c++ - 打印给定编号的所有分区

c++ - 如何实际使用 AddressSanitizer 和 MemorySanitizer?

c++ - 在内存映射文件中 boost C++ 偏移指针

c++ - 如何使用 boost::bind 将 io_service 对象传递给新线程?

c++ - 推导函数参数包的模板参数是否有缺陷

c++ - 删除以结构体为键的映射时出现段错误

c++ - BOOST_LOG_TRIVIAL 与 logrotate(重新打开日志)

c++ - 静态内联函数中的局部函数静态对象不共享

c++ - 基于 std::array 的多维数组