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)
voidclsは Python へラップするclass_のインスタンス。visitorはdef_visitorの派生クラス。cls.def(visitor) の呼び出しがこのメンバ関数へ転送される。
visitor.visit(cls, name, options)
voidclsは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())
;
}