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_ のインスタンス。visitordef_visitor の派生クラス。

    cls.def(visitor) の呼び出しがこのメンバ関数へ転送される。

    visitor.visit(cls, name, options)

    void

    clsclass_ のインスタンス、name は C 文字列。visitordef_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())
    ;
}