0

C++ Base および Derived クラスをラップしようとしていますが、Base は抽象クラスです。(これを編集して、この例の SSCCE を作成しました)。Base クラスはインターフェイスを定義します。Derived Python クラスでそれらを繰り返すのは好きではありません (それが可能かどうかはわかりません)。しかし、私はCythonを伝える方法がわかりません.DerivedはBaseから派生しています. いくつかの方法を試しましたが、成功しませんでした。

#include <string>

class Base {
    std::string name_;
public:
    Base (const std::string& name): name_(name) {}
    std::string name() const { return name_; }
    void setName(const std::string& name) { name_ = name; }
    virtual double length() const = 0;
    virtual ~Base() {}
};

class Derived: public Base {
    double len_;
public:
    Derived(const std::string& name, double len) : Base(name), len_(len){ }
    virtual double length() const { return len_; }
    void setLength(double len) { len_ = len; }
};

Cython を使用して、これら 2 つのクラスをラップしようとしています。

from libcpp.string cimport string

cdef extern from "base.h":
    cdef cppclass c_Base "Base":
        string name_
        string name()
        void setName(const string& name)

cdef extern from "base.h":
    ctypedef struct c_Derived "Derived":
        double len_
        double length()
        void setLength(double v)
    c_Derived *new_Derived "new Derived" (const string& name, double len)
    void del_Derived "delete" (c_Derived *p)


from tlib cimport c_Derived

cdef class Base:
    cdef c_Base *thisptr
    def __cinit__(self, const string& name):
        pass

    property name:
        def __get__(self): return self.thisptr.name()
        def __set__(self, const string& v): self.thisptr.setName(v)

cdef class Derived:
    cdef c_Derived *thisptr      # hold a C++ instance which we're wrapping

    def __cinit__(self, const string& name, double len):
        self.thisptr = new_Derived(name, len)

    def __dealloc__(self):
        del_Derived(self.thisptr)

    property length:
        def __get__(self): return self.thisptr.length()
        def __set__(self, double v): self.thisptr.setLength(v)

setup.py は次のようになります。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  name = 'pytlib',
  ext_modules=[
    Extension("tlib",
              sources=["tlib.pyx"], 
              include_dirs=["."],
              language="c++"),
    ],
  cmdclass = {'build_ext': build_ext},
)
4

0 に答える 0