如何在Python中为类类型应用SWIG OUTPUT类型映射?

如何在Python中为类类型应用SWIG OUTPUT类型映射?,第1张

如何在Python中为类类型应用SWIG OUTPUT类型映射

这个问题似乎已经解决了很长时间了,所以我认为我最好为这个问题提供解决方案。OUTPUT类型映射仅适用于简单类型,因此可以通过将

in
和类型
argout
映射组合来提供解决方案。

考虑一下这种情况,我们有一个

SampleImpl
实现C 接口的C

Samplebase
,从技术上来说,它不是接口,因为它涉及虚拟析构函数的实现。假设我们有一个静态函数,该函数返回错误代码和接口的实现。后者是对指针的引用,这是上面的情况。

接口头:

// Sample.hpp#pragma oncenamespace Module {  class Samplebase {  public:#ifndef SWIG    // Hint to the programmer to implement this function    static int SampleCreate(Samplebase *&obj);#endif    virtual ~Samplebase() = default;  };}

实施标头:

// Sample_impl.hpp#pragma once#include "Sample.hpp"namespace Module {  class SampleImpl : public Samplebase {  public:    static int SampleCreate(Module::Samplebase *&obj);    SampleImpl();    virtual ~SampleImpl();  private:    float a;  };}

实现方式:

// Sample_impl.cpp#include "Sample_impl.hpp"#include <cstdio>namespace Module {  int SampleImpl::SampleCreate(Module::Samplebase*& obj) {    obj = (Samplebase*) new SampleImpl();    return 0;  }  SampleImpl::SampleImpl() {    printf("SampleImpl::SampleImpl()n");  }  SampleImpl::~SampleImpl() {    printf("SampleImpl::~SampleImpl()n");  }}

SWIG界面(使用argout类型映射)

// example.i%module example%{  #define SWIG_FILE_WITH_INIT  #include "Sample.hpp"  #include "Sample_impl.hpp"%}%include "typemaps.i"%typemap(in, numinputs=0) Module::Samplebase *&obj (Module::Samplebase *temp) {   = &temp;}%typemap(argout) Module::Samplebase *& {  PyObject* temp = NULL;  if (!PyList_Check($result)) {    temp = $result;    $result = PyList_New(1);    PyList_SetItem($result, 0, temp);    // Create shadow object (do not use SWIG_POINTER_NEW)    temp = SWIG_NewPointerObj(SWIG_as_voidptr(*),  $descriptor(Module::Samplebase*),  SWIG_POINTER_OWN | 0);    PyList_Append($result, temp);    Py_DECREF(temp);  }}

在Python中的用法

import example// Creating specializationobj = example.SampleImpl()del obj// Creation of object using output typemaperrorCode, obj = example.SampleImpl_SampleCreate()del obj


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5661741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存