栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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) {  $1 = &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(*$1),  $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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659674.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号