如何使用SWIG从Perl访问C ++程序的List模板?

时间:2009-09-18 10:00:11

标签: perl swig

我想从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是否可以将列表作为数组返回?

2 个答案:

答案 0 :(得分:3)

首先,一般信息

This tutorial显示了如何为模板执行包装。

同一个教程展示了如何使用Perl中的模块,但perl示例没有触及模板。

This SO article显示了如何使用Vector

执行此操作

Here's a general SWIG STL documentation似乎提到 std_list.i 界面。

其次,关于列表

  1. 您无法通过下标“访问”Perl数组等C ++列表。如果您需要,则必须使用Vector作为基础类型。

  2. 作为替代方法,创建一个扩展List的类,给它一个新的方法,通过索引返回一个元素,并在接口中公开该方法。

  3. 如果您希望通过查找元素来访问列表,就像在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中完全被破坏了......