我正在为我的c ++项目使用Catch2。我为几个类编写了一个operator <
这对我自己的自定义类来说很好用。例如对于我的货币类,我有这个运算符<
std::ostream& operator<< (std::ostream& os, const Money& value);
我正在尝试为std :: chrono :: system_clock :: time_point类型的运算符写一个运气,但是没有运气。我的意思是,它确实可以毫无错误地进行编译,但是Catch2没有使用它。为什么?
这意味着我的测试将打印如下内容:
utility/test/Date.test.cpp:83: FAILED:
REQUIRE( actual == expected )
with expansion:
{?} == {?}
而不是像这样的东西:
utility/test/Date.test.cpp:83: FAILED:
REQUIRE( actual == expected )
with expansion:
TP2343234 == TP2343234
有趣的是,在同一test.cpp文件中的std :: cout上下文中,调用了time_point的运算符。
我的完整实现是这样的:
std::ostream& operator<< (std::ostream& os, const std::chrono::system_clock::time_point& value )
{
os << value.time_since_epoch().count();
return os;
}
测试用例是这样:
SECTION("Convert Date to std::chrono::system_clock::time_point")
{
auto one_day = std::chrono::duration<int, std::ratio<60*60*24>>(1);
std::chrono::system_clock::time_point epoch_plus_one_day = std::chrono::system_clock::time_point{} + one_day;
auto t = Date(1970, 1, 2).to_time_point();
std::cout << "std::chrono::system_clock::time_point{} " << epoch_plus_one_day.time_since_epoch().count() << std::endl;
std::cout << "t " << t.time_since_epoch().count() << std::endl;
REQUIRE(t == epoch_plus_one_day);
}
将产生以下输出:
std::chrono::system_clock::time_point{} 86400000000000
t 86400000000000
-------------------------------------------------------------------------------
Date object
Convert Date to std::chrono::system_clock::time_point
-------------------------------------------------------------------------------
Utility/test/Date.test.cpp:52
...............................................................................
utility/test/Date.test.cpp:61: PASSED:
REQUIRE( t == epoch_plus_one_day )
with expansion:
{?} == {?} // <- this should've printed "86400000000000 == 86400000000000".
您的自定义operator<<
使用ADL(依赖于参数的查找)进行查找。如果您使用的名称空间不同于为operator<<
定义的名称空间,则ADL将找不到它。您可以使用以下方法将其纳入范围:
using other::operator<<;
这里是一个免费的,仅开放源代码的标头库,它针对system_clock::time_point
:https://github.com/HowardHinnant/date/blob/master/include/date/date.h完全做到这一点>
示例用法:
#include "date/date.h" #include <iostream> int main() { using date::operator<<; std::cout << std::chrono::system_clock::now() << '\n'; }
示例输出:
2020-03-17 21:43:18.020096