2017-01-30 50 views
0

接口限制迫使我使用static_cast将MyObject*转换为void*。当这个指针回到以后的接口调用时,我必须执行另一个static_cast从void*MyObject*,因为在这种情况下dynamic_cast不起作用(解释为here)。任何方式执行static_cast之后的类型安全检查?

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

+0

不,您不必使用'static_cast'将'MyObject *'转换为'void *'。这是一个隐含的转换。是的,你必须使用'static_cast'从'void *'返回到'MyObject *'。 –

+0

显示回调提交和回调函数之间关联的代码注释通常足以提醒维护人员更新类型信息。如果人们在代码中出现错误,请编写脚本在构建期间运行以验证匹配类型。 –

+0

您还可以使用类型系统来帮助保证这一点,方法是为每个回调创建一个typedef并在两侧使用它。假设你有一个'async_lookup'函数,你可以声明'typedef DictionaryEntry async_lookup_cb_type' –

回答

1

不,一旦你点击了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()删除过期指针和铸造前检查集创建。

+0

你对此很清楚,但是在static_cast从'void *'到'MyObject *'之后没有任何方法可以执行类型检查吗?在一般情况下,这意味着我需要检查一个对象是否真的具有它所具有的类型。 – Migsi

+0

@Migsi:不可以。有三种情况需要考虑:检查通过,检查失败,未定义行为。尝试一个'static_cast '只能导致一个检查通过或UB,并且一旦你击中了UB,你就无法撤消它。所以“检查失败”的结果是不可能的。 – MSalters

相关问题