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ます。