例如,假设我们要测试这个类:
struct TestMe {
vector<int> getSomething();
}
测试功能由:
组成...
vector<int> Expected;
TestMe TM;
...
Result = TM.getSomething();
BOOST_CHECK_EQUAL(Result, Expected);
...
STL向量提供了一个自由运算符==,但它没有提供运算符&lt;&lt;,因此这段代码不能编译。 我怎样才能让它发挥作用?我可以定义自己的运算符&lt;&lt; ?它的实现是什么样的?对最通用的解决方案的额外信任:)
答案 0 :(得分:8)
我认为你应该使用BOOST_CHECK_EQUAL_COLLECTIONS
,这会测试每个元素并打印不匹配的位置:
BOOST_CHECK_EQUAL_COLLECTIONS(Result.begin(), Result.end(), Expected.begin(), Expected.end());
答案 1 :(得分:1)
我认为Philipp's answer是最好的答案。但是,如果您愿意,可以制作适用于矢量和其他标准容器的模板化operator<<()
:
// Will write out any container that has begin(), end() and a const_iterator type
template <typename C>
std::ostream& output_container(std::ostream& os, C const& c) {
for (typename C::const_iterator i = c.begin(); i != c.end(); ++i) {
if (i != c.begin()) os << ", ";
os << *i;
}
return os;
}
// Overload operators for each container type that forward to output_container()
template <typename T>
std::ostream& operator<<(std::ostream& os, vector<T> const& c) {
return output_container(os, c);
}
template <typename T>
std::ostream& operator<<(std::ostream& os, list<T> const& c) {
return output_container(os, c);
}
虽然您可以简单地将output_container()
重命名为operator<<()
并删除每容器类型operator<<()
模板,从而捕获所有尝试使用{ {1}}在类类型上,这可能会干扰其他类型的<<
函数模板。
答案 2 :(得分:0)
我正在寻找类似的东西,一种自定义输出字符串以十六进制打印整数的方法。将操作符注入std命名空间会起作用,但我测试中的每个BOOST_CHECK都将以十六进制格式打印。
所以我在boost名称空间中注入了一些自定义运算符,我可以用一些全局bool来控制它。
请在此处查看我的回答boost-check-fails-to-compile-operator-for-custom-types。