【问题标题】:Override std::equal覆盖 std::equal
【发布时间】:2014-05-21 21:57:52
【问题描述】:

在为 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;            
    }
};

谢谢。

【问题讨论】:

  • 你指的是什么hashmap?
  • 更新为 std::unordered_map
  • 平等应该是对称的。请不要这样做。
  • @FredOverflow:当然是对称的,但是如果两侧的一侧比另一侧更对称怎么办? :-)
  • 如果data1const METADATA&amp; data1,你如何分配给data1.Pointer?是mutable吗?

标签: c++ templates unordered-map


【解决方案1】:

让临时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;            
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多