boost/python/reference_existing_object.hpp
クラス
reference_existing_object クラス
-
struct reference_existing_object
reference_existing_objectは、C++ オブジェクトへの参照かポインタを返すC++関数をラップするのに使用する ResultConverterGenerator のモデルである。ラップした関数を呼び出すとき、戻り値が参照する値はコピーされない。新しい Python オブジェクトは参照先へのポインタを持ち、対応する Python オブジェクトと少なくとも同じ長さの寿命となるような処置はなされない。よって、with_custodian_and_ward等の CallPolicies モデルを利用した他の寿命管理無しでreference_existing_objectを使用すると非常に危険となる可能性がある。このクラスはreturn_internal_referenceの実装に使用されている。
reference_existing_object クラスの概要
namespace boost { namespace python
{
struct reference_existing_object
{
template <class T> struct apply;
};
}}
reference_existing_object クラスのメタ関数
-
template<class T>
struct apply - 要件
ある
Uに対してTがU&かU*。
-
typedef to_python_indirect<T, V> type
Vは、ラップする関数の戻り値が参照する先への所有権のないU*ポインタを持つインスタンスホルダを構築するexecute静的関数を持つクラス。
例
C++ 側
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/reference_existing_object.hpp>
#include <boost/python/return_value_policy.hpp>
#include <utility>
// ラップするクラス群
struct Singleton
{
Singleton() : x(0) {}
int exchange(int n) // x を設定し、古い値を返す
{
std::swap(n, x);
return n;
}
int x;
};
Singleton& get_it()
{
static Singleton just_one;
return just_one;
}
// ラッパコード
using namespace boost::python;
BOOST_PYTHON_MODULE(singleton)
{
def("get_it", get_it,
return_value_policy<reference_existing_object>());
class_<Singleton>("Singleton")
.def("exchange", &Singleton::exchange)
;
}
Python 側
>>> import singleton
>>> s1 = singleton.get_it()
>>> s2 = singleton.get_it()
>>> id(s1) == id(s2) # s1 と s2 は同じオブジェクトではないが
0
>>> s1.exchange(42) # 同じ C++ の Singleton を参照する
0
>>> s2.exchange(99)
42