0

我想从 Perl 脚本访问 C++ 程序的模板列表并使用这些值。

示例代码:

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 可以在这里将列表作为数组返回吗?

4

2 回答 2

3

首先,一般信息

本教程展示了如何为模板进行包装。

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

这篇 SO 文章展示了如何使用 Vector 来做到这一点

这是一个通用的 SWIG STL 文档,似乎提到了 std_list.i接口。

二、关于列表

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

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

  3. 如果您希望通过查找元素来访问列表,例如在 C++ 中,您需要编写一个公开 find() 方法的 List 接口——默认的接口不来自读取源代码。

于 2009-09-18T12:49:37.560 回答
1

在您的界面中,尝试:

%include "std_list.i"

%template(ListStruct1) std::list< Struct1 * >;

std 库有点有趣,没有真正的二进制对象叫做 list swig 可以包装,它都是模板 - 所以 swig 需要一些额外的帮助来弄清楚发生了什么。

这应该将插入、删除和一堆其他特定于列表的函数添加到包装器中。

如果上述方法不起作用,请尝试添加:

%define SWIG_EXPORT_ITERATOR_METHODS 

更新:当然,我没有提到(甚至没有意识到)这对 python、java 和其他一些非常有用,但是在 perl 中完全被破坏了......

于 2009-09-28T21:01:29.073 回答