<p>这个问题似乎有一段时间没有得到解决,所以我想我最好能为这个问题提供一个解决方案。输出类型映射只适用于简单类型,因此通过组合<code>in</code>和<code>argout</code>类型映射给出了一个解决方案。在</p>
<P>考虑情况,我们有一个C++类^ {< CD3>},它实现了一个C++接口^ {CD4>},这在技术上不是一个接口,因为它涉及实现一个虚拟析构函数。假设我们有一个静态函数,它返回一个错误代码和接口的实现。后者作为指针的引用,这就是上面的情况。在</p>
<p>接口标头:</p>
<pre><code>// Sample.hpp
#pragma once
namespace Module {
class SampleBase {
public:
#ifndef SWIG
// Hint to the programmer to implement this function
static int SampleCreate(SampleBase *&obj);
#endif
virtual ~SampleBase() = default;
};
}
</code></pre>
<p>实现标题:</p>
^{pr2}$
<p>实施:</p>
<pre><code>// 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");
}
}
</code></pre>
<p>SWIG接口(使用argout typemap)</p>
<pre><code>// 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);
}
}
</code></pre>
<p>Python中的用法</p>
<pre><code>import example
// Creating specialization
obj = example.SampleImpl()
del obj
// Creation of object using output typemap
errorCode, obj = example.SampleImpl_SampleCreate()
del obj
</code></pre>