boost/python/instance_holder.hpp
はじめに
<boost/python/instance_holder.hpp>
は、ラップするクラスの C++ インスタンスを保持する型の基底クラスである instance_holder
クラスを提供する。
クラス
instance_holder
クラス
-
class instance_holder : noncopyable
instance_holder
は、その具象派生クラスが Python のオブジェクトラッパ内で C++ クラスインスタンスを保持する抽象基底クラスである。Python 内で C++ クラスラッパからの多重継承を可能にするために、そのような各 Python オブジェクトは数珠繋ぎのinstance_holder
を持つ。ラップする C++ クラスの__init__
関数が呼び出されると新しいinstance_holder
インスタンスが作成され、そのinstall
関数を使用して Python オブジェクトにインストールされる。instance_holder
の各具象派生クラスは、保持する型について Boost.Python が問い合わせできるようholds
の実装を提供しなければならない。保持する型をラップするコンストラクタをサポートするため、クラスは所有する Python オブジェクトを第 1 引数PyObject*
として受け取り、残りの引数を保持する型のコンストラクタに転送するコンストラクタも提供しなければならない。第 1 引数は Python 内で仮想関数をオーバーライド可能にするのに必要であり、instance_holder
派生クラスによっては無視される可能性がある。
instance_holder
クラスの概要1
namespace boost { namespace python
{
class instance_holder : noncopyable
{
public:
// デストラクタ
virtual ~instance_holder();
// instance_holder の変更関数
void install(PyObject* inst) throw();
// instance_holder のオブザーバ
virtual void* holds(type_info) = 0;
};
}}
instance_holder
クラスのデストラクタ
-
virtual ~instance_holder()
- 効果
オブジェクトを破壊する。
instance_holder
クラスの変更関
-
void install(PyObject *inst) noexcept
- 要件
inst
が、ラップする C++ クラス型かその派生型の Python のインスタンスである。- 効果
新しいインスタンスを、保持するインスタンスの Python オブジェクトの数珠繋ぎの先頭にインストールする。
- 例外
なし。
instance_holder
クラスのオブザーバ関数
例
以下の例は、Boost.Python がスマートポイントが保持するクラスをラップするのに使用しているインスタンスホルダテンプレートの簡易バージョンである。
template <class SmartPtr, class Value>
struct pointer_holder : instance_holder
{
// SmartPtr 型から構築する
pointer_holder(SmartPtr p)
:m_p(p)
// 保持する型の転送コンストラクタ
pointer_holder(PyObject*)
:m_p(new Value())
{
}
template<class A0>
pointer_holder(PyObject*,A0 a0)
:m_p(new Value(a0))
{
}
template<class A0,class A1>
pointer_holder(PyObject*,A0 a0,A1 a1)
:m_p(new Value(a0,a1))
{
}
...
private: // ホルダに必要な実装
void* holds(type_info dst_t)
{
// SmartPtr 型のインスタンスと...
if (dst_t == python::type_id<SmartPtr>())
return &this->m_p;
// ...SmartPtr の element_type インスタンス
// (ポインタが非 null の場合)を保持する
return python::type_id<Value>() == dst_t ? &*this->m_p : 0;
}
private: // データメンバ
SmartPtr m_p;
};
- 1
訳注 noncopyable