我想从Perl脚本访问模板List of C ++ program并使用这些值。
示例代码:
typedef list < Struct1 * > sturct1_list;
struct Struct2
{
int i;
struct1_list List1;
}
struct Struct1
{
int j;
}
我使用了一个swig生成的api并执行了以下操作:
$myList = Struct2_struct1List_get
print "Reference type: " . ref($myList) ;
现在打印为:
Reference type: \_p\_std\_\_listTutils\_\_Struct1\_p\_t
如何使用此结构从结构中获取值?
我把
%template(ListStruct1) std::list< Struct1 * >;
生成“.pm”文件后。我查看了此列表中可用的API。
我找到了
ListStuct1_size
ListStuct1_empty
ListStuct1_clear
ListStuct1_push.
我能够使用这些元素。但我不知道如何使用这些API访问列表中的各个元素?或者我在界面文件中遗漏了什么?
更新:
typemap是否可以将列表作为数组返回?
答案 0 :(得分:3)
This tutorial显示了如何为模板执行包装。
同一个教程展示了如何使用Perl中的模块,但perl示例没有触及模板。
This SO article显示了如何使用Vector
执行此操作Here's a general SWIG STL documentation似乎提到 std_list.i 界面。
您无法通过下标“访问”Perl数组等C ++列表。如果您需要,则必须使用Vector作为基础类型。
作为替代方法,创建一个扩展List的类,给它一个新的方法,通过索引返回一个元素,并在接口中公开该方法。
如果您希望通过查找元素来访问列表,就像在C ++中一样,您需要编写一个公开find()方法的List接口 - 默认情况下不会读取源代码。
答案 1 :(得分:1)
在界面中,尝试:
%include "std_list.i"
%template(ListStruct1) std::list< Struct1 * >;
std库有点好笑,没有实际的二进制对象名为list,swig可以直接包装,它是所有模板 - 所以swig需要一些额外的帮助来弄清楚发生了什么。
这应该为包装器添加insert,remove和一堆其他列表特定的函数。
如果上述方法无效,请尝试添加:
%define SWIG_EXPORT_ITERATOR_METHODS
更新:当然,我忽略了提及(或者甚至意识到)这对python,java和其他一些人来说非常有用,但在perl中完全被破坏了......