我已经确定了三种解决问题的方法operator<<
.
第一种方法是提供一个operator<<
适合您的类型。这是需要的,因为当boost_check_equal
失败,它还通过调用记录失败operator<<
与物体。请参阅休息后的详细附录,了解这是如何实际完成的。这比看起来更难。
第二种方法是不进行我刚才提到的日志记录。你可以通过以下方式做到这一点#definine
ing BOOST_TEST_DONT_PRINT_LOG_VALUE
。要仅禁用一个测试的日志记录,您可以使用以下命令包围有问题的测试#define
,然后立即#undef
it:
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
第三种方法是回避对operator<<
它适用于您的类型,不将一项与另一项进行比较,而只是检查一个布尔值:
BOOST_CHECK (first == second);
选择您喜欢的方法。
我的偏好是第一个,但实施起来却极具挑战性。如果你简单地定义一个operator<<
在全球范围内,它不会起作用。我认为这是因为名称解析的问题。解决此问题的一个流行建议是将operator<<
in the std
命名空间。这至少在某些编译器的实践中是有效的,但我不喜欢它,因为标准禁止向std
命名空间。
我发现更好的方法是实现自定义print_log_value
针对您的类型的类模板专门化。print_log_value
是 Boost.Test 内部用来实际调用正确的类模板operator<<
对于指定的类型。它委托给一个operator<<
做繁重的工作。专精print_log_value
对于您的自定义类型,Boost 正式支持[需要引用],并由此完成。
假设你的类型被称为Timestamp
(它在我的代码中),首先定义一个全局自由operator<<
for Timestamp
:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...然后提供print_log_value
专门化,委托给operator<<
你刚刚定义了:
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()( std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}