boost/python/def_visitor.hpp
はじめに
<boost/python/def_visitor.hpp>
は、class_
インターフェイスを分散させないよう class_
の def
メンバの機能を非侵入的に拡張する汎用的な訪問インターフェイスを提供する。def_visitor<>
クラステンプレートを宣言する。テンプレート引数は、その visit
メンバ関数を介して実際の def
機能を提供する派生型 DerivedVisitor
である。
クラス
def_visitor<DerivedVisitor>
クラステンプレート
-
template<class DerivedVisitor>
class def_visitor def_visitor
クラスは、その派生クラスを引数にとる(基底)クラスである。def_visitor
はプロトコルクラスであり、派生クラスであるDerivedVisitor
はメンバ関数visit
を持たなければならない。def_visitor
クラスが直接インスタンス化されることはなく、代わりに派生クラスDerivedVisitor
のインスタンスがclass_
のdef
メンバ関数の引数として渡される。
def_visitor
クラスの概要
namespace boost { namespace python {
template <class DerivedVisitor>
class def_visitor {};
}
def_visitor
の要件
クライアントが与える DerivedVisitor
テンプレート引数は、
def_visitor
から非公開派生していなければならないdef_visitor_access
クラスへのフレンドアクセスを認めなければらない下表に挙げる
visit
メンバ関数のいずれかあるいは両方を定義しなければらない式
戻り値の型
要件
効果
visitor.visit(cls)
void
cls
は Python へラップするclass_
のインスタンス。visitor
はdef_visitor
の派生クラス。cls.def(visitor) の呼び出しがこのメンバ関数へ転送される。
visitor.visit(cls, name, options)
void
cls
はclass_
のインスタンス、name
は C 文字列。visitor
はdef_visitor
の派生クラス。options
は文脈固有のオプション引数。cls.def(name, visitor) または cls.def(name, visitor, options) の呼び出しがこのメンバ関数へ転送される。
例
class X {/*...*/};
class my_def_visitor : boost::python::def_visitor<my_def_visitor>
{
friend class def_visitor_access;
template <class classT>
void visit(classT& c) const
{
c
.def("foo", &my_def_visitor::foo)
.def("bar", &my_def_visitor::bar)
;
}
static void foo(X& self);
static void bar(X& self);
};
BOOST_PYTHON_MODULE(my_ext)
{
class_<X>("X")
.def(my_def_visitor())
;
}