这个问题似乎已经解决了很长时间了,所以我认为我最好为这个问题提供解决方案。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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)