【问题标题】:Tcl C++ API - how to type safe convert a void pointerTcl C++ API - 如何类型安全转换 void 指针
【发布时间】:2013-06-12 05:03:03
【问题描述】:

我在我的代码中使用Tcl_CreateObjCommand(interp, cmdName, proc, clientData, deleteProc) 并将DerivedClass 指针传递给clientData 参数。在回调函数中,我想将 clientData 键入安全转换(dynamic_cast)回 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
}

【问题讨论】:

  • dynamic_cast from “void *”,你做不到。使用static_cast,见this question
  • 我知道,谢谢。但是在运行时有一些情况,一个非 DerivedClassPointer 会被传递到回调函数中并导致分段错误。因此,如果可能的话,我想进行安全转换。
  • 您控制客户端。只将一种常见类型的客户端数据传递给回调,然后在使用static_cast 时不会错误地将其转换为错误的类型。如果您想要多态性,请将公共类型委托给多态对象。

标签: c++ type-conversion tcl dynamic-cast tcl-api


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2015-02-14
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多