如何为指针引用定义 SWIG 类型映射?
Posted
技术标签:
【中文标题】如何为指针引用定义 SWIG 类型映射?【英文标题】:How do I define a SWIG typemap for a reference to pointer? 【发布时间】:2009-09-30 17:31:01 【问题描述】:我有一个用 C++ 编写的 Publisher 类,有以下两种方法:
PublishField(char* name, double* address);
GetFieldReference(char* name, double*& address);
这个类的 Python 绑定是使用 SWIG 生成的。在我的 swig .i 文件中,我有以下内容:
%pointer_class(double*, ptrDouble);
这让我可以发布一个在 Python 变量中定义的字段:
value = ptrDouble()
value.assign(10.0)
PublishField("value", value.cast())
尝试使用 GetFieldReference 方法会导致 TypeError:
GetFieldReference("value", newValue)
我想我需要为返回 ptrDouble 的 double*& 创建一个类型映射,但我不太确定会是什么样子。
【问题讨论】:
【参考方案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)
【讨论】:
【参考方案2】:这个 typemap 应该可以解决问题 -
// Typemaps for double *&
%typemap(in) double *& (double *ppDouble = NULL) %
$1 = &ppDouble ;
%
%typemap(argout) double *&
*(double **)&jarg2 = *$1;
%typemap(javain) double *& "$javainput"
您可能需要检查分配具有所需双精度值的 jarg2(在“argout”类型映射中)是否正确,或者应该分配 jarg1。
【讨论】:
以上是关于如何为指针引用定义 SWIG 类型映射?的主要内容,如果未能解决你的问题,请参考以下文章
如何为方法 MongoDB.Bson.Serialization.BsonSerializer.Deserialize 自定义映射字段名称或类型