я использую Tcl_CreateObjCommand (interp, cmdName, proc, clientData, deleteProc) в моем коде и передачи указателя DerivedClass на параметр clientData. В функции обратного вызова я хочу ввести безопасное преобразование (dynamic_cast) clientData обратно в указатель DerivedClass, но компилятор gcc жалуется »source is not a class to pointer
Msgstr «Это потому, что 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
вы получаете всегда в силе. Лучший способ сделать это с помощью функции шаблона, которая проверяет (во время компиляции), что типы являются правильными.
Других решений пока нет …