如何计算 std::weak_ptr 的哈希值?

2023-12-21

所以我有使用的代码std::weak_ptr并将它们维护在std::set,而且效果很好——并且在过去的五七年里一直有效。最近我想我应该在一个std::unordered_set(嗯,实际上在一个f14::F14ValueSet)为此,我需要它的哈希值。截至目前,还没有std::hash<std::weak_ptr>,那么我应该做什么呢?

答案似乎是“只是散列控制块”,正如这个问题和答复所暗示的那样:为什么在 C++0x 中没有为 std::weak_ptr 定义 std::hash ? https://stackoverflow.com/questions/4750504/why-was-stdhash-not-defined-for-stdweak-ptr-in-c0x,但是我如何访问控制块呢?在glibc中,它位于__weak_ptr<>::_M_refcount._M_pi->但这是私有的(并且是特定于实现的)。我还可以做些什么?

一个答案是“等等”:也许有一天会有一个标准owner_hash() for std::weak_ptr http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/p1901r1.html,但我更喜欢现在可用的东西。


制作你自己的增强弱指针。

它存储一个哈希值,并支持==基于owner_before().

You must使这些来自shared_ptrs,作为没有强引用的弱 ptr,无法进行哈希处理以匹配其所有者;这可能会创建两个比较相等但散列不同的增强弱指针。

template<class T>
struct my_weak_ptr {
  // weak ptr API clone goes here.  lock() etc.

  // different ctor:
  my_weak_ptr(std::shared_ptr<T>const& sp){
    if(!sp) return;
    ptr=sp;
    hash = std::hash<T*>{}(sp.get());
  }
  std::size_t getHash()const{return hash;}
  friend bool operator<(my_weak_ptr const& lhs, my_weak_ptr const& rhs){
    return lhs.owner_before(rhs);
  }
  friend bool operator!=(my_weak_ptr const& lhs, my_weak_ptr const& rhs){
    return lhs<rhs || rhs<lhs;
  }
  friend bool operator==(my_weak_ptr const& lhs, my_weak_ptr const& rhs){
    return !(lhs!=rhs);
  }
private:
  std::weak_ptr<T> ptr;
  std::size_t hash=0;
};

它们具有稳定、合理的哈希值。虽然回收的对象指针会导致哈希冲突,但只要它们不共享控制块,它们就不会相等。

namespace std{template<class T>struct hash<some_ns::my_weak_ptr<T>>{
  std::size_t operator()(my_weak_ptr<T> const& wp)const{return wp.getHash();}
};}

一个警告:使用别名构造函数可能会导致病态结果。因为相等性基于控制块相等性,而不是指针值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算 std::weak_ptr 的哈希值? 的相关文章

  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • Dapper 强类型查询返回默认对象值

    刚刚开始使用 Dapper 并喜欢它 我遇到了问题 它返回正确数量的对象 但它们的属性都有默认值 using var dbConnection Connection await dbConnection OpenAsync const st
  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • 如何使用 C# 打印 pdf

    我在 C 应用程序中使用 进程 打印 pdf 文件 但是我无法获取打印状态 我发现可以通过 System management 和 System printing 与打印机 队列进行交互 我做了很多尝试 但都出错了使用这两个命名空间但无法打
  • 在两个 .cpp 文件之间定义全局变量 [重复]

    这个问题在这里已经有答案了 如何在 A cpp 和 B cpp 之间共享 全球化 bool 变量 其中它们都不包含其他 h 文件 他们有其他联合头文件 但彼此没有 我可以在这些共享标头中定义全局变量吗 Thanks 我可以在这些共享标头中定
  • C#9 顶级语句文件上的属性

    我正在尝试向顶级语句文件添加属性 但没有找到任何相关信息 是否可以 对于某些上下文 我想仅在该文件中禁用规则 SuppressMessage StyleCop CSharp LayoutRules SA1516 ElementsMustBe
  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • 使用正则表达式匹配以“Id”结尾的单词?

    如何组合一个正则表达式来匹配以 Id 结尾的单词并进行区分大小写的匹配 试试这个正则表达式 w Id b w 允许前面的单词字符Id和 b确保Id位于单词末尾 b是字边界断言
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • 为什么在 .net 中使用 Invoke on Controls? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 NET不允许跨线程操作 https stackoverflow com questions 2896504 why net does not allow cross thread operat
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • C 中的静态和动态绑定(严格来说是 C,而不是 C++)是什么?

    我最初对发布这个问题感到担忧 以免它重复 但即使在谷歌搜索了许多关键字之后 我在 StackOverflow 上找不到任何解释 C 的静态和动态绑定的链接 尽管有 C 的问题和答案 但是都涉及classes以及显然不适合 C 的东西 Sta
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为

随机推荐

  • C# Winform CollectionPropertiesEditor - 如何根据运行时条件隐藏内置 PropertyGrid 中的某些属性

    有没有办法隐藏 CollectionPropertiesEditor s PropertyGrid 中的显示属性 最近我发现有一种方法可以在运行时更改 PropertyGrid 的 Browsable 属性 我想知道是否可以对 Collec
  • 通过应用内购买来奖励 iOS 应用测试版测试人员?

    我的 iOS 应用程序将免费 但可以通过应用程序内购买启用附加功能 目前 Beta 测试人员在寻找错误方面做得非常出色 我想奖励他们的辛勤工作 我认为我至少可以为他们提供该应用程序的完整版本 这样他们就不必自己购买该功能 但是 我不确定执行
  • 关于 Android 上持久数据的建议?

    有一个网络服务提供了我的应用程序使用的一些数据 这些数据相当大 并且很少更改 因此我认为如果应用程序可以将其缓存在 SD 卡上并仅根据需要进行更新 那就太好了 目前 我正在获取数据 一个 XML 文件 并使用 SAX 将其解析为对象树 通过
  • 如何将 R 公式中的一项替换为两项?

    我有一些类似的东西 y x z 我想把它改造成 y x part1 x part2 z 更一般地说 我希望有一个函数 它接受一个公式并返回该公式 并将所有与 x 匹配的术语替换为 x part1 和 x part2 这是我当前的解决方案 但
  • 根据给定的字符串输入确定类型

    有什么方法可以检测给定字符串输入的类型吗 Eg string input 07 12 1999 string DetectType s Type t DetectType input which would return me the ma
  • 在 Windows 上成功使用 shutdown.rmtree 后,os.mkdir 可能会失败并出现 PermissionError

    考虑以下用于清理目录的 python 函数 def cleanDir path shutil rmtree path os mkdir path 在 Windows 上 实际在 Windows7 和 Windows10 上使用 python
  • 设置要在并行性中使用的核心

    我感觉这个问题的答案是否定的 但是使用 Net 4 0 的并行性 您可以设置要运行的内核数量 即如果您运行四核 您可以将应用程序设置为仅使用其中的 2 个 Thanks 是的 它是 Parallel For 的内置功能 使用接受 Paral
  • 如何防止 .NET 实体中的私有属性通过服务公开为公共属性?

    我正在创建一个 WCF 服务 用于传输通过实体框架创建的实体对象 我有一个映射到用户数据库表的用户实体 我不想向客户端公开某些用户字段 密码 创建日期等 但是因为它们在数据库中不可为空 所以 Visual Studio 需要映射 将这些属性
  • 在react-router中用连字符匹配路由

    我有这样的网址 http 0 0 0 0 country bosnia and herzegovina 644 这是我的路线声明
  • docker 使用 --interactive 和 --tty 标志运行

    Edit 有人标记重复的这个问题 https stackoverflow com questions 48368411 what is docker run it flag 但它根本没有解释底层机制 但相比之下 这个堆栈溢出 https s
  • OS X:检测系统范围的 keyDown 事件?

    我正在为 Mac OS X 开发一个打字辅导应用程序 即使该应用程序未处于焦点状态 也需要将击键转发给它 有没有办法让系统将击键转发到应用程序 可能通过 NSDistributedNotificationCenter 我用谷歌搜索了自己愚蠢
  • 将 JSON 导入 Eclipse 项目

    我是一名有抱负的 Java 程序员 希望在项目中使用 JSON 我正在遵循一个编程教程 来自一本书 它要求我使用以下行将 JSON 导入到我的项目中 import com google appengine repackaged org js
  • 苹果推送消息

    我正在将推送提供商服务器与谷歌代码中的代码 php apns 集成 除了每条消息的字节数之外 一切似乎都很好 每个有效负载的字节数最多应为 256 个字符 如果发送一些汉字或者UTF 8字符 JSON编码后 每个字符占用6个字节 我对吗 所
  • 在网站上使用内联/base64 图像比仅链接到硬文件要快多少?

    使用 base64 line 来显示图像比简单地链接到服务器上的硬文件快多少 url data image png base64 我还没有找到任何类型的性能指标 我有几个顾虑 您不再获得缓存的好处 Base64 的大小不是比 PNG JPE
  • 在 Sass 中使用 CSS 属性变量

    我正在编写一个 mixin 其中包含一些数学计算元素的百分比宽度 但由于它非常有用 我也想对其他属性使用相同的函数 例如边距和填充 有没有办法将属性名称作为参数传递给 mixin mixin w fluid property name w
  • “EntityManager 没有持久性提供程序”错误

    我是 JPA 的新手 我尝试从书中做一个简单的例子 但无论我做什么 我都会收到以下错误 Exception in thread main javax persistence PersistenceException No Persisten
  • Java的排序算法是什么[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 OpenJDK 内部如何对数据类型进行排序以及为什么 如果能说一下具体的算法就太好了 从版本 7 开始 Oracle 的 Java 实
  • 如何更改conda base的路径

    I am a Linux集群用户 当我安装了一个版本miniconda 集群有自己的版本anaconda 当我做 conda info envs 输出是 conda environments home user miniconda3 env
  • 如何使用类型级函数动态创建静态类型?

    在 TypeScript 中 有类型级 功能允许根据给定创建新类型literal 类型 规格 see 映射类型 https www staging typescript org docs handbook advanced types ht
  • 如何计算 std::weak_ptr 的哈希值?

    所以我有使用的代码std weak ptr并将它们维护在std set 而且效果很好 并且在过去的五七年里一直有效 最近我想我应该在一个std unordered set 嗯 实际上在一个f14 F14ValueSet 为此 我需要它的哈希