0

PerlスクリプトからC++プログラムのテンプレートリストにアクセスし、それらの値を使用したいと思います。

コード例:

typedef list < Struct1  * > sturct1_list;

struct Struct2
{
    int i;
    struct1_list List1;
}

struct Struct1
{
    int j;
}

私は1つの小枝で生成された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を使用してリストの個々の要素にアクセスする方法がわかりませんか?または、インターフェイスファイルに何かがありませんか?

更新しました:

タイプマップはここでリストを配列として返すことができますか?

4

2 に答える 2

3

まず第一に、一般的な情報

このチュートリアルでは、テンプレートのラッパーを作成する方法を示します。

同じチュートリアルでPerlのモジュールの使用方法を示していますが、perlの例ではテンプレートに触れていません。

このSOの記事は、Vectorを使用してそれを行う方法を示しています

これは、 std_list.iインターフェイスに言及しているように見える一般的なSWIGSTLドキュメントです。

第二に、リストについて

  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ライブラリはちょっとおかしいです。swigがラップできるlistと呼ばれる実際のバイナリオブジェクトはありません。それはすべてテンプレートです。したがって、swigは何が起こっているのかを理解するために追加の支援が必要です。

これにより、挿入、削除、およびその他のリスト固有の関数がラッパーに追加されます。

上記が機能しない場合は、次を追加してみてください。

%define SWIG_EXPORT_ITERATOR_METHODS 

更新:もちろん、これはpython、java、およびその他のいくつかの機能でうまく機能することを言及することを怠りました(または気付くことさえありません)が、perlでは完全に壊れています...

于 2009-09-28T21:01:29.073 に答える