Thanks Araq. I will try that this afternoon, but I think I tried and it failed for some reason. In any case, I will probably hide completely needing to do so.
I continue with the doubt about how to properly wrap: template <class T2> static typename opencascade::std::enable_if<is_base_but_not_same<T2, T>::value, handle>::type DownCast (const handle<T2>& theObject) { return handle (dynamic_cast<T*>(const_cast<T2*>(theObject.get()))); } Run given that later is used like this: aPnt3 = Handle(Geom_CartesianPoint)::DownCast (aPnt1); Run and why the following is producing the `cannot instantiate 'T2'` error: proc downcast*[T; T2](this: Handle[T] ): Handle[T2] {.cdecl, importcpp: "Handle('0)::Downcast(@)".} Run