Tag: downcasting

如何使用SWIG生成的接口在C#中正确转发?

我有一个非常庞大和成熟的C ++代码库,我正在尝试使用SWIG生成一个C#接口。 我无法改变实际的C ++代码本身,但我们可以使用SWIG提供的任何方式来扩展/更新它。 我面临的问题是,如下所示编写的C ++函数会导致C#出现问题。 A* SomeClass::next(A*) 调用者可能会执行以下操作: A* acurr = 0; while( (acurr = sc->next(acurr)) != 0 ){ if( acurr isoftype B ){ B* b = (B*)a; …do some stuff with b.. } elseif( acurr isoftype C ) … } 本质上,迭代一个元素容器,根据它们的真实类型,做一些不同的事情。 SWIG为“next”函数生成了C#层,遗憾的是执行了以下操作: return new A(); 因此,C#中的调用代码无法确定返回的对象是否实际上是派生类,它实际上似乎总是基类(这确实有意义)。 我遇到过几种解决方案: 使用%extend SWIG关键字在对象上添加方法,最终调用dynamic_cast。 正如我所看到的,这种方法的缺点是,这需要您了解inheritance层次结构。 在我的情况下它是相当巨大的,我认为这是一个维护问题。 使用%factory关键字提供方法和派生类型,并让SWIG自动生成dynamic_cast代码。 这似乎是第一个更好的解决方案,但是从更深层次的角度来看,它仍然需要您搜索所有方法以及它可能返回的所有可能的派生类型。 […]