我已经确定了三种解决问题的方法operator<<
。
第一种方法是operator<<
为您的类型提供一个。这是必需的,因为当boost_check_equal
失败时,它还会通过调用operator<<
对象来记录失败。请参阅休息后的详细附录,以了解这是如何实际完成的。这比看起来更难。
第二种方法是不做我刚才提到的日志记录。你可以通过#definine
ing来做到这一点BOOST_TEST_DONT_PRINT_LOG_VALUE
。要仅对一项测试禁用日志记录,您可以用 this 包围有问题的测试#define
,然后立即使用#undef
它:
#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<<
命名std
空间中。这至少在某些编译器上是有效的,但我不喜欢它,因为标准禁止向std
命名空间添加任何内容。
我发现一个更好的方法是print_log_value
为您的类型实现自定义类模板特化。 print_log_value
是 Boost.Test 内部使用的类模板,用于实际调用operator<<
指定类型的正确值。它委托给一个operator<<
做繁重的工作。print_log_value
Boost [需要引用] 正式支持 专门针对您的自定义类型,并因此完成。
假设您的类型被调用Timestamp
(它在我的代码中),首先定义一个全局 free 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);
}
};
}}