Type
コピーできないクラスがあり、デフォルトのコンストラクターが含まれています。A
上記のクラスのセットとして機能する2番目のクラスがあります。この 2 番目のクラスはイテレータを介してアクセスを提供し、私のイテレータには逆参照演算子があります。
class A {
class iterator {
[...]
public:
Type & operator*()
{
return instance;
}
private:
Type instance;
}
[...]
};
boost::python
ここで、次のようなコードを書いたことを明らかにします。
class_<A>("A", [...])
.def("__iter__", iterator<A, return_internal_reference<> >())
.def("__len__", container_length_no_diff<A, A::iterator>)
;
コード Python のすべてのイテレータ操作 (構築、代入、逆参照、破棄) に出力メッセージを追加した後、次のようにします。
for o in AInstance:
print o.key
出力を取得します(重要な部分にトリミングされています):
construct 0xffffffff7fffd3e8
dereference: 0xffffffff7fffd3e8
destroy 0xffffffff7fffd3e8
get key 0xffffffff7fffd3e8
上記のコードでは、これらのアドレスはinstance
メンバー (またはthis
メソッド呼び出し) のアドレスです。最初の 3 行は によって生成されiterator
、4 行目は の getter メソッドによって出力されType
ます。したがって、どういうわけかboost::python
、次のような方法ですべてをラップします。
- イテレータを作成します
- イテレータを逆参照し、参照を格納します
- イテレータ (およびそれに含まれるオブジェクト) を破棄します
- ステップ 2 で取得した参照を使用
したがって、メソッド呼び出しの結果が参照されている限り、オブジェクトを保持する必要がある場合は、明らかにreturn_internal_reference
述べたように動作しません (実際には typedef over であることに注意してください)。with_custodian_and_ward_postcall<>
だから私の質問は、そのようなイテレータをPythonにどのように公開するのboost::python
ですか?
編集:
指摘されたように、明確ではないかもしれません: 元のコンテナには type のオブジェクトが含まれていませんType
。BaseType
オブジェクトを構築/変更できるいくつかのオブジェクトが含まれていType
ます。したがってiterator
、上記の例では のように動作しtransform_iterator
ます。