【问题标题】:Any way to perform type safety check after static_cast?有什么方法可以在 static_cast 之后执行类型安全检查?
【发布时间】:2017-06-15 19:47:11
【问题描述】:

接口限制迫使我使用 static_cast 将 MyObject* 转换为 void*。在以后的接口调用中获取此指针时,我必须执行另一个从 void*MyObject* 的 static_cast,因为在这种情况下 dynamic_cast 不起作用(解释为 here)。

但是,我想执行类型安全检查,以确保在其他人更改部分代码时不会发生奇怪的事情。如果在这种情况下可以进行任何检查,哪一项是最好/最方便的?

【问题讨论】:

  • 不,您不必使用static_castMyObject* 转换为void*。这是一个隐式转换。是的,您必须使用static_castvoid* 回到您的MyObject*
  • 显示回调提交和回调函数之间联系的代码cmet通常足以提醒维护者更新类型信息。如果人们在您的代码中经常出错,请编写脚本以在构建期间运行以验证匹配类型。
  • 您还可以使用类型系统来帮助保证这一点,方法是为每个回调创建一个 typedef 并在两侧使用它。假设你有一个async_lookup 函数,你可以声明一个typedef DictionaryEntry<Word> async_lookup_cb_type
  • @ZanLynx 这是一个罕见的情况,我必须在我们的代码中进行 void* 转换(并将其转换回其初始类型)。所以几乎不可能有人会弄错。关于您的 typedef 想法,您能否提供一个更准确的示例?
  • @Migsi:我不想写代码示例。只需在接口的发送端和接收端使用 typedef,这样如果类型发生更改,更改 typedef 会自动在所有地方更改它。

标签: c++ casting void-pointers type-safety


【解决方案1】:

不,一旦您点击void*,这一切都取决于代码是否正确。根本原因是理论上你返回的void* 几乎可以指向任何东西:charintstd::stringstd::complex<double>std::map<int, int>::iterator,当然还有MyObject

您将面临的问题是,只有当 void* 实际指向 MyObject 时,您的演员表才会起作用,但在这种情况下,演员表无论如何都不是必需的。

一种非强制转换的解决方法是保留您通过强制转换MyObject* 创建的所有void* 中的std::unordered_set<void*>,通过~MyObject() 删除过期指针,并在强制转换前检查该集合。

【讨论】:

  • 您对此显然是正确的,但是在从void*MyObject* 的static_cast 之后没有任何方法可以执行类型检查吗?一般来说,这意味着我需要检查一个对象是否真的具有它似乎具有的类型。
  • @Migsi:不。有 3 种情况需要考虑:检查通过、检查失败、未定义行为。尝试static_cast<MyObject*> 只能导致检查通过或UB,一旦你点击UB,你就无法撤消它。所以“检查失败”的结果是不可能的。
猜你喜欢
  • 2019-02-05
  • 2011-01-20
  • 1970-01-01
  • 2015-04-20
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多