我正在为 C++ 中的对象图实现“克隆”功能,部分问题是确保如果有两个指向同一个对象的指针,它不会被克隆两次。我通过保留 amap<void*, void*>
来做到这一点,它将原始对象作为键,将克隆版本作为值。克隆对象时,我使用模板函数检查对象是否在地图中 - 如果是,我将其返回为static_cast<T*>
,否则,我克隆它并将原始和克隆存储在地图中,并隐式转换为void*
.
这种方案的问题在于,如果一个对象在两个地方被不同的类型(例如,通过接口与具体类型)引用,则强制转换void*
可能不会产生相同的值。这意味着该对象被克隆了两次。
我在网上寻找现有的解决方案,并意识到 Boost.Serialization 必须处理同样的问题。但是在浏览了它的源代码之后,我找不到实际跟踪对象指针的部分。
任何人都可以通过建议可行的设计或指出 Boost 代码中执行此操作的部分来提供帮助吗?