接口限制迫使我使用static_cast将MyObject*
转换为void*
。当这个指针回到以后的接口调用时,我必须执行另一个static_cast从void*
到MyObject*
,因为在这种情况下dynamic_cast不起作用(解释为here)。任何方式执行static_cast之后的类型安全检查?
但是,我想执行一个类型安全检查,以确保没有奇怪的事情发生,如果其他人更改了部分代码。如果在这种情况下可以进行任何检查,哪一个检查最好/最方便?
接口限制迫使我使用static_cast将MyObject*
转换为void*
。当这个指针回到以后的接口调用时,我必须执行另一个static_cast从void*
到MyObject*
,因为在这种情况下dynamic_cast不起作用(解释为here)。任何方式执行static_cast之后的类型安全检查?
但是,我想执行一个类型安全检查,以确保没有奇怪的事情发生,如果其他人更改了部分代码。如果在这种情况下可以进行任何检查,哪一个检查最好/最方便?
不,一旦你点击了void*
这完全取决于代码是否正确。根本原因在于你理论上回归的void*
几乎可以指向任何东西:a char
,int
,std::string
,std::complex<double>
, std::map<int, int>::iterator
并且当然还有MyObject
。
您将面对的问题是,只有当void*
实际指向MyObject
时,您的演员阵容才会有效,但在这种情况下演员阵容并非必要。
非铸造的解决方法是保持一个std::unordered_set<void*>
所有void*
您铸造MyObject*
,通过~MyObject()
删除过期指针和铸造前检查集创建。
不,您不必使用'static_cast'将'MyObject *'转换为'void *'。这是一个隐含的转换。是的,你必须使用'static_cast'从'void *'返回到'MyObject *'。 –
显示回调提交和回调函数之间关联的代码注释通常足以提醒维护人员更新类型信息。如果人们在代码中出现错误,请编写脚本在构建期间运行以验证匹配类型。 –
您还可以使用类型系统来帮助保证这一点,方法是为每个回调创建一个typedef并在两侧使用它。假设你有一个'async_lookup'函数,你可以声明'typedef DictionaryEntry async_lookup_cb_type' –