我在代码中使用Tcl_CreateObjCommand(interp, cmdName, proc, clientData, deleteProc)并将DerivedClass指针传递给clientData参数。在回调函数中,我想输入safeData(dynamic_cast)clientData回到DerivedClass指针,但gcc编译器抱怨“source is not a class to pointer
”。这是因为clientData是一种void指针。在这个用例中,开发人员在使用Tcl API时通常如何处理这个问题?
int main()
{
...
Tcl_CreateObjCommand(interp, cmdName, myCallback, myDerivedClassPointer, (Tcl_CmdDeleteProc *)NULL);
}
myCallback(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
{
// I want to do something like this, so when the pointer is not a DerivedClassPointer type, throw an exception.
DerivedClass* foo = dynamic_cast<DerivedClass*>(clientData);
if(!foo) throw exception, type conversion fail
}
答案 0 :(得分:0)
正如@PeterWood所说:这是不可能的。此外,任何无效指针首先传递给Tcl_CreateObjCommand
都是一个错误。
正确的方法(同样如@PeterWood所述)是确保您收到的ClientData
始终有效。最好的方法是使用模板函数检查(在编译时)类型是否正确。