【发布时间】:2019-01-05 18:05:08
【问题描述】:
我有一个指针 void* p 指向一个未知类型的变量,还有一个容器 std::set<MyClass*> c 填充有 MyClass 指针。有没有办法找出c是否包含p(即它是否包含指向与p相同的内存地址的指针)而不需要手动循环遍历c中的元素,这不会导致未定义的行为? (请注意,如果我在 c 中找不到它,我不会取消引用 p。)
另外,如果p 指向的数据类型的变量与MyClass 无关,我假设将p 转换为MyClass* 会导致未定义的行为,但也许情况并非如此?
【问题讨论】:
-
请注意,
std::set的指针使用 指针本身 作为“键”,而不是它所指向的。所以你需要做的就是调用它的find函数来查看集合是否包含指针。 -
你能改成
std::set<MyClass*, std::less<void>>吗?然后您可以使用将 void 指针作为比较器的 find 方法将是 "transparent". -
@Someprogrammerdude:但指针类型不同......并且演员可能是 UB IIRC。
-
@Jarod42 我认为您的建议可能是赢家! (你应该把它写成一个实际的答案。)我星期一回去工作时必须尝试一下。
-
@HelloGoodbye:我已经发布了答案 ;-)
标签: c++ casting undefined-behavior void-pointers