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 クラスのオブザーバ関数

virtual void *holds(type_info x = 0)
戻り値

*this がオブジェクトを保持している場合、x が示す型のオブジェクトへのポインタ。それ以外の場合 0。

以下の例は、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