【发布时间】:2017-06-15 19:47:11
【问题描述】:
接口限制迫使我使用 static_cast 将 MyObject* 转换为 void*。在以后的接口调用中获取此指针时,我必须执行另一个从 void* 到 MyObject* 的 static_cast,因为在这种情况下 dynamic_cast 不起作用(解释为 here)。
但是,我想执行类型安全检查,以确保在其他人更改部分代码时不会发生奇怪的事情。如果在这种情况下可以进行任何检查,哪一项是最好/最方便的?
【问题讨论】:
-
不,您不必使用
static_cast将MyObject*转换为void*。这是一个隐式转换。是的,您必须使用static_cast从void*回到您的MyObject*。 -
显示回调提交和回调函数之间联系的代码cmet通常足以提醒维护者更新类型信息。如果人们在您的代码中经常出错,请编写脚本以在构建期间运行以验证匹配类型。
-
您还可以使用类型系统来帮助保证这一点,方法是为每个回调创建一个 typedef 并在两侧使用它。假设你有一个
async_lookup函数,你可以声明一个typedef DictionaryEntry<Word> async_lookup_cb_type -
@ZanLynx 这是一个罕见的情况,我必须在我们的代码中进行 void* 转换(并将其转换回其初始类型)。所以几乎不可能有人会弄错。关于您的 typedef 想法,您能否提供一个更准确的示例?
-
@Migsi:我不想写代码示例。只需在接口的发送端和接收端使用 typedef,这样如果类型发生更改,更改 typedef 会自动在所有地方更改它。
标签: c++ casting void-pointers type-safety