c++ - SWIG:处理派生类中的基类重载方法

标签 c++ python inheritance swig overloading

我正在努力让 SWIG 变得更加优雅......

我有一个基类,其中包含一个重载方法 create:

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 语句(尽管我知道这可以解决问题),但这只是意味着大量重复代码。

有什么想法吗?

最佳答案

您确定类声明正确吗?派生类中的同名虚拟方法会隐藏基类方法,除非 using 将基函数带入派生命名空间。示例:

class A
{
    public:
        void func(int a);
        virtual void func(int a,int b);
};

class  B : public A
{
    public:
        //using A::func;
        virtual void func(int a,int b);
};

使用 SWIG 和 Python,我无法编写:

b = B()
b.func(1)    # failed
b.func(1,2)

如果没有取消注释上面的 using 行,这些类在 C++ 中也无法正常工作。通过 using,SWIG 正确地将函数公开给 Python,并且 C++ 也起作用了。

关于c++ - SWIG:处理派生类中的基类重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13505954/

相关文章:

c++ - "::function()"在cpp中是什么意思?

c++ - MS Visual Studio 到 Linux - 在 VirtualBox 中编译和调试

c++ - 在socket编程的select()中重新启动定时器

python - 在 Sympy 中设置变量相对于其他变量的假设

C++ 多态性——调用具有不同签名的派生类方法

Java Lombok 库 : builder annotation issues with Inheritance

c++ - 通过将最小的数字放在第一位来将两个数组组合成一个

python - Pandas :增加日期时间

python - scipy.fft 挂起某些声音文件

c++ - C++ 中的向上转型是否允许访问父级的私有(private)成员或 friend