我有一個類Type
它不能複製,也不包含默認的構造函數。 我有第二類A
作爲一組上述類。這第二類通過迭代器可以訪問我的迭代器引用操作:如何使用boost :: python :: iterator和return_internal_reference?
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
)的地址。 前三行由iterator
生成,第四行由Type
中的getter方法打印。所以不知何故boost::python
包裝在這樣的方式的一切,它:
- 創建迭代
- 解除引用迭代器和存儲基準
- 破壞迭代器(和對象包含)
- 使用在步驟2 獲得的參考
很清楚return_internal_reference
不像表述那樣(請注意,它實際上只是typedef ove r with_custodian_and_ward_postcall<>
)只要方法調用的結果被引用,它應該保持對象。
所以我的問題是如何將這樣一個迭代器暴露給Python boost::python
?
編輯:
正如有人指出,它可能不是很清楚:原來的容器中不含Type
類型的對象。它包含一些我能夠構造/修改對象的對象。所以iterator
在上面的例子中就像transform_iterator
一樣。
所以有點相同,我想出了自己。另外純粹的'Type * instance;'將很難追蹤到我認爲的某種共享指針是更好的方法。特別是'boost :: python'支持(幾乎?)沒有努力。 此外,這種方法有一個缺點是由於分配速度變慢,所以我最終選擇了實現拷貝構造函數並按值返回(儘管我必須做一些測試來確定它比分配指針數據更快)。 – elmo
我想你完全錯過了這一點。我有一些'transform_iterator'。我想返回的對象實例不存在於任何地方。 Container不包含'Type'對象,但是允許我構造'Type'。 – elmo
@elmo:您可能需要考慮更新原始問題以反映這些需求/意圖,因爲此時沒有提及'transform_iterator',並且存在包含您想要返回的'Type'對象的建議在'A'內。 –