2

コードでTcl_CreateObjCommand(interp, cmdName, proc, clientData, deleteProc)を使用し、DerivedClass ポインターを clientData パラメーターに渡しています。コールバック関数で、clientData を DerivedClass ポインターに安全に変換 (dynamic_cast) したいのですが、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
}
4

1 に答える 1

0

@PeterWoodが言ったように:これは不可能です。Tcl_CreateObjCommandさらに、そもそも無効なポインターが渡されたのはバグです。

正しい方法(@PeterWoodが述べているように)は、ClientData受け取るものが常に有効であることを確認することです。これを行う最善の方法は、型が正しいことを (コンパイル時に) チェックするテンプレート関数を使用することです。

于 2015-08-30T22:12:57.667 に答える