C++ std::hash用于std::chrono::duration

C++ std::hash用于std::chrono::duration,c++,c++11,hash,chrono,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::mil

我试图在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;
}
#包括
#包括
福班决赛
{
公众:
Foo(){}
int-y;
};
内部主(空)
{
自动映射=标准::无序映射();
map[std::chrono::duration(5)]。y=0;
返回0;
}
/usr/include/c++/4.9/bits/hashtable_policy.h:在 'struct std::u detail::u是_noexcept_hash>,std::hash>>':


我猜这里的问题是没有std::chrono::duration的std::hash实现?如果没有,有没有一种方法可以不必对非常容易损坏的count()进行键入就可以做到这一点?

那么,您可以在自己的std::hash实现下隐藏
count


float
s是不可散列的,这就是问题所在。已更改为int,但仍然存在相同的问题,尽管现在的解决方案可能更易于处理。散列计数()有什么问题?那么?映射键的持续时间是毫秒,因此,所有count()都是毫秒。您需要支持多大的持续时间?如果它不是太大,您可以使用一个细粒度类型作为映射,然后对该类型使用
duration\u cast
其他duration。@Robinson,我刚刚编辑了我的答案,静态\u cast就足够了
#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;
}
return std::hash<_rep>{}( static_cast<std::chrono::duration<_rep, std::micro>>(s).count());