3

キー、値、コメントなどを含むクラスであるstd::vector<Foo>whereを含むFooクラスがあります。辞書ではなくベクトルを使用しているのには理由があることに注意してください。

foos["Key Name"]「キー名」(ここfoosで、は)に一致するキーを持つFooオブジェクトをベクトルで検索するように、C++で添え字演算子をオーバーロードしましたstd::vector<Foo>

SWIGを使用してライブラリのPythonラッパーを作成していますが、この添え字演算子をPythonに拡張したいと考えています。foos["Key Name"]つまり、 Pythonでベクター内のオブジェクトを検索するためにを使用できるようにしたいと思います。

SWIGに添え字演算子を認識させ、Pythonでオーバーロードする方法に関するヒントはありますか?これをオンラインで行っている人の例が見つからなかったことに少し驚いています。std::mapほとんどの人はを使用して、SWIGにPythonに変換させていると思いdictます。

4

2 に答える 2

5

単純な Python では、添字演算子をオーバーロードする場合は、__getitem__and__setitem__クラス メソッドを作成します。簡単な例として:

class MyClass(object):
    def __init__(self):
        self.storage = {}

    def __getitem__(self, key):
        return self.storage[key]

    def __setitem__(self, key, value):
        self.storage[key] = value

したがって、C++ でこれを処理したい場合は、C++ で__getitem__andを作成することをお勧めします (いいえ、確認していません) __setitem__。これは、C++ コードで直接行うか、%extendSWIG 内のディレクティブを使用して C++[]演算子を呼び出すことができます。

于 2011-06-04T19:45:14.037 に答える
2

Python インデクサーは__getitem__メソッド__setitem__です。

それらを実装する方法については、こちらを参照してください。

または、より現代的な SWIG で%extend 句を使用することもできます。

于 2011-06-04T19:44:21.657 に答える