在 static_cast 之后执行类型安全检查的任何方法?
Any way to perform type safety check after static_cast?
接口限制迫使我使用 static_cast 将 MyObject*
转换为 void*
。在以后的接口调用中取回此指针时,我必须执行另一个 static_cast 从 void*
到 MyObject*
,因为 dynamic_cast 在这种情况下不起作用(解释 here).
但是,我想执行类型安全检查,以确保如果其他人更改部分代码不会发生奇怪的事情。如果有任何检查可以在这种情况下执行,那么best/most哪个是方便的?
不,一旦您点击了 void*
,就完全取决于代码来获得正确的转换。根本原因是你返回的 void*
理论上可以指向几乎任何东西:a char
, int
, std::string
, std::complex<double>
, std::map<int, int>::iterator
当然还有 MyObject
。
您将面临的问题是,只有当 void*
实际上指向 MyObject
时,您的转换才会起作用,但在那种情况下,转换并不是必需的。
non-casting 解决方法是保留您通过转换 MyObject*
创建的所有 void*
的 std::unordered_set<void*>
,通过 ~MyObject()
删除过期指针,以及在投射之前检查那个集合。
接口限制迫使我使用 static_cast 将 MyObject*
转换为 void*
。在以后的接口调用中取回此指针时,我必须执行另一个 static_cast 从 void*
到 MyObject*
,因为 dynamic_cast 在这种情况下不起作用(解释 here).
但是,我想执行类型安全检查,以确保如果其他人更改部分代码不会发生奇怪的事情。如果有任何检查可以在这种情况下执行,那么best/most哪个是方便的?
不,一旦您点击了 void*
,就完全取决于代码来获得正确的转换。根本原因是你返回的 void*
理论上可以指向几乎任何东西:a char
, int
, std::string
, std::complex<double>
, std::map<int, int>::iterator
当然还有 MyObject
。
您将面临的问题是,只有当 void*
实际上指向 MyObject
时,您的转换才会起作用,但在那种情况下,转换并不是必需的。
non-casting 解决方法是保留您通过转换 MyObject*
创建的所有 void*
的 std::unordered_set<void*>
,通过 ~MyObject()
删除过期指针,以及在投射之前检查那个集合。