我正在努力使这在 SWIG 中变得有点优雅......
我有一个包含重载方法创建的基类:
class Base {
public:
virtual Foo *create(ClassA &, ClassB &) = 0;
Foo *create(int id) {
// get ClassA a and ClassB b from an internal store related to id
return create(a, b);
}
};
这当然是 SWIG 包装的,没有任何麻烦。
在其他位置/存储库中,有几个不同的 Base 派生类,它们当然定义了它们自己版本的纯虚拟 create(ClassA&,ClassB&) 方法 - 但它们不需要定义 create(int) 变体,因为基类版本应该足够了。
这些派生类的 SWIG 包装只看到派生类中定义的 create() 方法,并且不提供具有单个 int 参数的变体,即使它们应该从基类继承它。
我已经尝试使用 %rename 作为基类的方法来获得一些有用的东西,例如
%rename (_create1) Base::create(ClassA&,ClassB&);
%rename (_create2) Base::create(int);
%extend (Base) {
%pythoncode {
def create(self, a_or_id, b=None):
if b is not None:
self._create1(a_or_id, b):
else:
self._create2(a_or_id)
}
}
这在生成的 python/_wrap.cc 代码中似乎很好,但是派生类的包装器只会包装 create() 方法,就好像 %renames 不存在一样。
它们位于单独的 .i 文件中,但派生类的 .i 文件每个都导入基类 .i 文件,因此 python 类继承是正确的,只是 C++ 类继承在某种程度上被这个覆盖的方法打败了。
理想情况下,我想要一个解决方案,我不必在所有派生类的 .i 文件中插入 %rename 语句(尽管我知道这会解决问题),这只是意味着大量重复的代码。
有任何想法吗?