我正在尝试在std :: chrono :: duration上键入一组对象。这不会编译:
#include <unordered_map>
#include <chrono>
class Foo final
{
public:
Foo() {}
int y;
};
int main(void)
{
auto map = std::unordered_map<std::chrono::duration<int, std::milli>, Foo>();
map[std::chrono::duration<int, std::milli>(5)].y = 0;
return 0;
}
/ usr / include / c ++ / 4.9 / bits / hashtable_policy.h:在实例化中 'struct std :: __ detail :: __ is_noexcept_hash&gt;,std :: hash&gt; &GT; &GT;':
我猜这里的问题是std :: chrono :: duration没有std :: hash实现吗?如果没有,有没有一种方法可以做到这一点,而不必依赖于显着易碎的计数()?
答案 0 :(得分:1)
好吧,你可以在自己的std :: hash实现Redirect all urls exactly, just change domain name下隐藏count
:
#include <unordered_map>
#include <chrono>
class Foo final
{
public:
Foo() {}
int y;
};
using namespace std::chrono_literals;
// custom specialization of std::hash can be injected in namespace std
namespace std
{
template<typename _rep, typename ratio>
struct hash<std::chrono::duration<_rep, ratio>>
{
typedef std::chrono::duration<_rep, ratio> argument_type;
typedef std::size_t result_type;
result_type operator()(argument_type const& s) const
{
return std::hash<_rep>{}(s.count());
}
};
}
int main(void)
{
auto map = std::unordered_map<std::chrono::duration<float, std::milli>, Foo>();
map[std::chrono::duration<float, std::milli>(5)].y = 12;
std::cout << map[5ms].y; // thanks to std::chrono_literals
return 0;
}
如果您害怕将不同的比率传递到地图中,您还可以将static_cast
用于一些最小的时间精度,例如。 std::micro
:
return std::hash<_rep>{}( static_cast<std::chrono::duration<_rep, std::micro>>(s).count());