覆盖std :: equal

时间:2014-05-21 21:57:53

标签: c++ templates unordered-map

在为std :: unordered_map的equal_to运算符提供特化时,我想知道是否可以确定哪个lhs或rhs是当前存储在hashmap中的数据?我想做这样的事情:

template<>
struct equal_to<METADATA>
{
    bool operator() (METADATA const& data1, METADATA const& data2)
    {
        if (data1.Size == data2.Size)
        {
            // Need to look up the stored pointer in a global data structure
            SIZE_T Pointer = g_Pointer + data1.Offset;

            return memcmp(reinterpret_cast<void*>(Pointer), reinterpret_cast<void*>(data2.Pointer), data1.Size) == 0;
        }

        return false;            
    }
};

感谢。

1 个答案:

答案 0 :(得分:0)

让临时METADATA包含一个标志,确定是否使用全局指针。可能使用OffsetPointer的标记值。

template<>
struct equal_to<METADATA>
{
    bool operator() (METADATA const& data1, METADATA const& data2)
    {
        if (data1.Size == data2.Size)
        {
            // Need to look up the stored pointer in a global data structure
            void * pointer1 = data1.Pointer;
            if (pointer1 == NULL)
                pointer1 = g_Pointer + data1.Offset;
            void * pointer2 = data2.Pointer;
            if (pointer2 == NULL)
                pointer2 = g_Pointer + data2.Offset;

            return memcmp(pointer1, pointer2, data1.Size) == 0;
        }

        return false;            
    }
};