如何为指针引用定义SWIG类型映射?

时间:2009-09-30 17:31:01

标签: c++ python swig

我有一个用C ++编写的Publisher类,它有以下两种方法:

PublishField(char* name, double* address);
GetFieldReference(char* name, double*& address);

使用SWIG生成此类的Python绑定。在我的swig .i文件中,我有以下内容:

 %pointer_class(double*, ptrDouble);

这让我发布一个在Python变量中定义的字段:

value = ptrDouble()
value.assign(10.0)
PublishField("value", value.cast())

尝试使用GetFieldReference方法会导致TypeError:

GetFieldReference("value", newValue)

我想我需要为double *&创建一个类型图。返回一个ptrDouble,但我不太确定它会是什么样子。

2 个答案:

答案 0 :(得分:1)

这是我提出的一个有效的解决方案。

将一个包装函数添加到swig.i文件中:

%inline %{
    double * GetReference(char* name, Publisher* publisher)
    {
         double* ptr = new double;
         publisher->GetFieldReference(name, ptr);
         return ptr;
    }
%}

现在从Python我可以使用以下内容:

value = ptrDouble.frompointer(GetFieldReference("value", publisher)

答案 1 :(得分:0)

这个类型图应该可以解决问题 -

// Typemaps for double *&
%typemap(in) double *& (double *ppDouble  = NULL) %{
$1 = &ppDouble  ;
%}

%typemap(argout) double *& {
*(double **)&jarg2 = *$1;
}

%typemap(javain) double *& "$javainput"

您可能需要检查是否正确分配jarg2(在“argout”类型映射中)是否正确,或者是否应该指定jarg1。