オブジェクト(クラスAのインスタンス)を作成し、それらのメソッドを呼び出すことができるPythonプログラムにそれらを渡すライブラリがあります。
基本的に私はC++クラスのインスタンスを持っており、Pythonからそれらを使用したいと思います。場合によっては、そのオブジェクトを操作のためにC++に戻す必要があります。
New
次のラッパーファイルを作成しました(関数がC ++コードのどこかで呼び出されていると仮定します)。
#include <boost/python.hpp>
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace boost;
using namespace boost::python;
int calls = 0;
struct A
{
int f() { return calls++; }
~A() { std::cout << "destroyed\n"; }
};
shared_ptr<A> existing_instance;
void New() { existing_instance = shared_ptr<A>( new A() ); }
int Count( shared_ptr<A> a ) { return a.use_count(); }
BOOST_PYTHON_MODULE(libp)
{
class_<A>("A")
.def("f", &A::f)
;
def("Count", &Count);
register_ptr_to_python< shared_ptr<A> >();
}
このコードには、Pythonが。を取得する部分がありませんexisting_instance
。私はそれを貼り付けませんでしたが、その目的のためにコールバックメカニズムを使用するとしましょう。
このコードは機能しますが、いくつか質問があります。
Count関数(および他のすべてのC ++操作関数)では、
a
そのように渡すのは問題ありませんか、それとも次のようなことを行う方が良いconst shared_ptr<A>&
ですか?Python Boostのドキュメントで見つけたコードスニペットでは、参照がよく使用されますが、違いがわかりません(もちろん、より高い参照カウンターがあることを除けば)。このコードは「安全」ですか?既存のインスタンスをpythonに渡すと、そのカウンターがインクリメントされます(Pythonでオブジェクトのコピーをさらに作成する場合でも、もちろん1回だけです)。そのため、Pythonが保持している限り、C++コードがオブジェクトを破棄することはできません。少なくとも「コピー」。私は正しいですか?ポインタで遊んでみましたが、正解のようです。念のためお願いします。
PythonがAのインスタンスを作成しないようにしたいのですが、C++コードからのみ渡す必要があります。どうすればそれを達成できますか?編集:見つかりました、私はno_initとコピー不可を使用する必要があります:
class_<A, boost::noncopyable>("A", no_init)