【问题标题】:SWIG: Coping with baseclass overloaded methods in a derived classSWIG:处理派生类中的基类重载方法
【发布时间】:2012-11-10 10:52:53
【问题描述】:

我正在努力让这在 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 语句(尽管我知道这会解决问题),这只是意味着大量重复代码。

有什么想法吗?

【问题讨论】:

    标签: c++ python inheritance swig overloading


    【解决方案1】:

    你确定类声明正确吗?派生类中的同名虚拟方法隐藏基类方法,除非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 问题。我想我知道/为什么/我遇到了这个问题,似乎没有真正优雅的解决方案,哦,好吧。 SWIG 在它可以处理的内容上有些限制,我理解为什么会这样。
    • 事实上,我很抱歉,你对 C++ 的东西也是正确的!直到现在才注意到 - 子类的实例在没有 using 行的情况下看不到重载的方法。
    • 很高兴为您提供帮助!如果答案有用,请考虑通过投票工具投票并标记答案正确,并检查答案左侧。
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2017-04-03
    • 2014-10-17
    • 2014-12-23
    • 2021-09-26
    • 2012-09-19
    相关资源
    最近更新 更多