我有一个用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,但我不太确定它会是什么样子。
答案 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。