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

2024-04-25 21:42:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力使这个在斯威格酒中显得优雅。。。在

我有一个包含重载方法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);
    }
};

这当然是,无需麻烦就包装好了。在

在其他位置/存储库中,有几个不同的Base派生类,它们当然定义了它们自己的纯虚拟创建(ClassA&;和ClassB&;)方法的版本,但它们不需要定义create(int)变量,因为基类版本就足够了。在

这些派生类的SWIG包装只看到在派生类中定义的create()方法,不提供带有单个int参数的变量,即使它们应该从基类继承它。在

我尝试过使用%rename作为基类的方法来获得一些有用的东西,例如

^{pr2}$

这在生成的python中似乎很好/_包裹.cc代码,但派生类的包装器将只包装create()方法,就像不存在%renames一样。在

它们在分离的.EMI中是.i文件,但是派生类.i文件都导入了基础文件。我文件,所以Python类继承是正确的,只是C++类继承,被这个被覆盖的方法稍微打败了。在

理想情况下,我希望有一个解决方案,我不必在所有派生类'.I文件中插入%rename语句(尽管我知道这样可以解决问题),它只意味着大量重复的代码。在

有什么想法吗?在


Tags: 文件方法版本idbase定义foocreate
1条回答
网友
1楼 · 发布于 2024-04-25 21:42:44

你确定类声明正确吗?派生类中同名的虚拟方法隐藏基类方法,除非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,我无法编写:

^{pr2}$

没有注释^ ^ }行,并且类也没有在C++中正确工作。使用{{CD1}},SWIG正确地将函数暴露给Python和C++。在

相关问题 更多 >