std :: hash for std :: chrono :: duration

时间:2017-08-25 11:41:46

标签: c++ c++11 hash chrono

我正在尝试在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实现吗?如果没有,有没有一种方法可以做到这一点,而不必依赖于显着易碎的计数()?

1 个答案:

答案 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());