5

SWIG を使用して、ヘッダー ファイルのみを使用して既存の C++ ライブラリをラップしています。このライブラリは、名前空間とテンプレート クラスを使用して、カスタム オブジェクトの配列を作成します。ラップされた配列内の要素にアクセスするために使用される添字演算子 (operator[]) をラップしようとすると、問題が発生します。SWIG は、operator[] が無視され、代わりに %extend を使用する必要があることを教えてくれます。

small.i:18: Warning 389: operator[] ignored (consider using %extend)

したがって、extend を使用しようとしていますが、どのような構文を試しても、挿入されたコードを _wrap.cxx ファイルに表示できません。これが私のSWIG入力ファイルです:

%module tltest
%{
...
%}

namespace nite {
    template <class T> class Array {
    public:
        %rename(__getitem__) operator[];
        const T& operator[](int index) const {return m_data[index];}

        %rename(__len__) getSize;
        int getSize() const {return m_size;}
    };

    class UserData : private NiteUserData
    {
    public:
    };

    %template(userDataArray) Array<UserData>;

};

%extend Array<UserData> {
    UserData& __getitem__(unsigned int i) {
        return $self[i];
     }
}

__getitem__Python の関数を定義して、配列クラスにインデックス付けできるようにしたいことはわかっています。__len__関数の名前が正しく変更され、Python インターフェイスから適切に機能することに注意してください。

ただし、__getitem__呼び出しを定義するために追加した %extend ブロックが small_wrap.cxx ラッパー ファイルに挿入されることはないようです。誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

3

あはは!次のように、%extend ブロックで名前空間を使用してすべての型を修飾する必要があることを発見しました。

%extend nite::Array<nite::UserData> {
    nite::UserData __getitem__(unsigned int i) {
        return (*($self))[i];
    }
}
于 2013-05-09T16:18:14.600 に答える