アプリケーションに Python が埋め込まれており、C++ コードにあるオブジェクトへの生のポインタを Python 関数に送信したいと考えています。
これを行う方法を見つけた唯一の方法は、ポインターをauto_ptr
またはでラップするshared_ptr
ことですが、Pythonコードがコード内のオブジェクトへの参照を保持する可能性を持たせたくないので、そうしないことを好みます。
これはboost::pythonで可能ですか?
アプリケーションに Python が埋め込まれており、C++ コードにあるオブジェクトへの生のポインタを Python 関数に送信したいと考えています。
これを行う方法を見つけた唯一の方法は、ポインターをauto_ptr
またはでラップするshared_ptr
ことですが、Pythonコードがコード内のオブジェクトへの参照を保持する可能性を持たせたくないので、そうしないことを好みます。
これはboost::pythonで可能ですか?
Python にマップされた C++ オブジェクトへの生のポインターがある場合、次のようにアダプターを使用して、元のポインターの周りに別の Python オブジェクトを作成できます。
template<typename PtrT>
struct PtrAdapter {
auto& get(PtrT ptr) { return *ptr; }
};
次に、Python でマップされた型にし、暗黙的な変換を許可します。
class_<Cluster<LinksT>*, noncopyable>(typpedName<LinksT>("ClusterPtr", true, true)
, "Raw hierarchy cluster pointer\n")
.def("__call__", &PtrAdapter<Cluster<LinksT>*>::get,
return_internal_reference<>(),
"referenced cluster")
;
register_ptr_to_python<Cluster<LinksT>*>();
参照される型 (この場合はCluster<LinksT>
) も適切な Python オブジェクトにマップする必要があることに注意してください。
次に、そのような C++ コードの場合:
Cluster<LinksT>* cl = clusters.head();
process(cl);
Id cid = cl->id();
同様の Python コードを使用できます。
cl = clusters.head()
process(cl)
cid = cl.id()
しかし、 C++ オブジェクトへのポインターの特別な処理が必要ない場合は、明らかにboost::python::ptr
.
また、ここで言及されている代替案も検討する必要があります: boost::python: howto call a function that expected a pointer?