我在代码中使用Tcl_CreateObjCommand(interp, cmdName, proc, clientData, deleteProc),并将DerivedClass指针传递给clientData参数。在回调函数中,我想将clientData的类型安全转换(dynamic_cast)返回给DerivedClass指针,但是gcc编译器抱怨“source is not a class to pointer”。这是因为clientData是空指针的一种。在这种用例中,开发人员在使用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
}

最佳答案

正如@PeterWood所说:这是不可能的。此外,首先将所有无效指针传递给Tcl_CreateObjCommand是一个错误。

正确的方法(再次如@PeterWood所述)是确保您收到的ClientData始终有效。最好的方法是使用模板函数,该函数在编译时检查类型是否正确。

关于c++ - Tcl C++ API-如何键入安全转换无效指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17127250/

10-12 00:07