gpt4 book ai didi

c++ - std::hash 用于 std::chrono::duration

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:26 24 4
gpt4 key购买 nike

我正在尝试在 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: In instantiation of 'struct std::__detail::__is_noexcept_hash >, std::hash > > >':

我猜这里的问题是没有 std::chrono::duration 的 std::hash 实现?如果没有,是否有一种方法可以做到这一点而无需诉诸于非常易碎的 count() 键?

最佳答案

好吧,您可以在自己的 std::hash 实现下隐藏 count http://en.cppreference.com/w/cpp/utility/hash :

#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;
}

如果您害怕将不同的比率传递到您的 map 中,您还可以将 static_cast 用于一些最小的时间精度,例如。 std::micro:

return std::hash<_rep>{}( static_cast<std::chrono::duration<_rep, std::micro>>(s).count()); 

关于c++ - std::hash 用于 std::chrono::duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com