【发布时间】:2014-01-01 02:08:54
【问题描述】:
我正在寻找最常见和最可靠的方法来检查 void* 是否可以在给定的 C++ 对象类型中转换。您可以在下面看到有关上下文的一些信息。
当我为 DLL 定义 C API 时,我经常使用 void* 来隐藏我在后面使用的 C++ 对象(如下所示)
typedef void* Instance_t;
int createInstance(Instance_t* pInst);
int processing(Instance_t inst, uint8_t* pBuf, size_t bufLength);
当我createInstance代码cast这样的指针时:
int createInstance(Instance_t* pInst)
{
MyClass* ptr = new MyClass();
*pInst = (void*)(ptr);
//.... etc
return 0;
}
但问题是我们如何在稍后定义的所有其他 C 函数中检查我们收到的 void* 值是否是有效 MyClass*。我认为我们不能,因为在这种情况下,没有一个 C++ 强制转换运算符是真正类型安全的(即使是 dynamic_cast)。
目前我最好的解决方案是使用 C 转换(或 reinterpret_cast),如果一切正常,则调用 MyClass 定义的 IsValid 函数。
你有更好的方法来做这个检查吗?
【问题讨论】:
-
你怎么知道数据是有效的?你在脑海中应用了什么一致性测试?将其应用于收到的数据,如果它通过数据可能会很好。
-
转发声明你的类型并且只在你的
*.c源中定义它。这避免了void *的使用,因为您需要类型检查 -
如果你对 RTTI 没问题,你可以perhaps do something like you wish
-
@RogerRowland 这仅适用于指向多态类型的指针,不适用于
void*。 -
@MikeSeymour 是的,这是真的,对不起,它需要一个共同的基础而不是
void*,我讨厌CObject类型的方法。