c++ - Tcl C++ API - 如何类型安全地转换一个空指针

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

我正在使用 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/

上一篇:C++ 文件字符编码

下一篇:C++编译困惑

相关文章:

c++ - 如何使用 SDL2 和 OpenGL 绘制三角形?

c# - 我怎样才能从一个非类型化的表达式返回到一个类型化的表达式?

sql-server - SQL Server 导入和导出向导中的源类型 200?

exec - 理解 TCL CATCH exec 问题的问题

arrays - TCL 如何将数组作为类成员 (Itcl)

tcl - 在 Buildroot 中安装 Tcl tk 二进制文件

c++ - 从另一个类中修改对象的 std::vector

C++ 构造要求一个未在 .h 中定义的结构

c++ - QT Creator Main.cpp 主窗口.cpp

c++ - 将 string::iterator 转换为 std::string