从 SWIGged Python 中的 C++ 基类派生

Posted

技术标签:

【中文标题】从 SWIGged Python 中的 C++ 基类派生【英文标题】:Derive from C++ base class in SWIGged Python 【发布时间】:2016-09-01 13:09:30 【问题描述】:

注意:对应的要点是here。


我有一个抽象基类和一个接受指向基类的指针的方法,例如,

#ifndef MYTEST_HPP
#define MYTEST_HPP

#include <iostream>
#include <memory>

class MyBaseClass 
  public:
    virtual
    double
    eval(const double x) const = 0;
;

class Square: public MyBaseClass 
  public:
    virtual
    double
    eval(const double x) const
    
      return x*x;
    
;


void
mytest(const std::shared_ptr<MyBaseClass> & a) 
  std::cout << a->eval(1.0) << std::endl;
  std::cout << a->eval(2.0) << std::endl;
  std::cout << a->eval(3.0) << std::endl;


#endif // MYTEST_HPP

在 SWIGging 之后

%module mytest

%
#define SWIG_FILE_WITH_INIT
#include "mytest.hpp"
%

%include <std_shared_ptr.i>
%shared_ptr(MyBaseClass);
%shared_ptr(Square);

%include "mytest.hpp"

我可以创建 Square 实例并将它们从 Python 中输入 mytest,例如,

import mytest
a = mytest.Square()
mytest.mytest(a)

正如预期的那样,这将打印出来

1.0
4.0
9.0

我现在想从MyBaseClass 派生更多类,但要从 Python 派生。不幸的是,只是做

class Cube(mytest.MyBaseClass):
    def __init__(self):
        return

    def eval(self, x):
        return x*x*x

c = Cube()
mytest.mytest(c)

导致错误

Traceback (most recent call last):
  File "../source/test.py", line 14, in <module>
    mytest.mytest(c)
TypeError: in method 'mytest', argument 1 of type 'std::shared_ptr< MyBaseClass > const &'

有什么提示吗?

【问题讨论】:

【参考方案1】:

知道了(通过https://***.com/a/9042139/353337):

MyBaseClass添加导演功能

%module(directors="1") mytest

%
#define SWIG_FILE_WITH_INIT
#include "mytest.hpp"
%

%include <std_shared_ptr.i>
%shared_ptr(MyBaseClass);
%shared_ptr(Square);

%feature("director") MyBaseClass;

%include "mytest.hpp"

并在 Python 中正确初始化类

class Cube(mytest.MyBaseClass):
    def __init__(self):
        mytest.MyBaseClass.__init__(self)
        return

    def eval(self, x):
        return x*x*x

【讨论】:

以上是关于从 SWIGged Python 中的 C++ 基类派生的主要内容,如果未能解决你的问题,请参考以下文章

更改 Python swigged C 函数的返回值类型

ImportError:在 python 中导入 swigged c++-class 时未定义的符号

将派生类型的对象从 python 传递到 C++ 函数时会出现 Boost Python 运行时错误,该函数期望将 shared_ptr 传递给基类型

调用非虚拟基方法时,C++ 中的虚拟继承是不是有任何惩罚/成本?

Item 43:访问模板基类中的名称 Effective C++笔记

(C++) 从派生类运算符调用基运算符