boost/python/overloads.hpp
はじめに
C++ の関数、メンバ関数および多重定義群から既定の引数とともに Python の関数および拡張クラスのメソッドの多重定義群を生成する機能を定義する。
overload-dispatch-expression
overload-dispatch-expression ::= 'see-other-document'
overload-dispatch-expression
は、拡張クラスのために生成するメソッドの多重定義群を記述するのに使用する。以下のプロパティを持つ。
- docstring
メソッドの
__doc__
属性に束縛される値を持つ ntbs- keywords
生成するメソッドの引数(の最後列)に名前を付ける
keyword-expression
。- call policies
CallPolicies モデルの何らかの型。
- minimum arity
生成するメソッド多重定義が受け付ける引数の最小数。
- maximum arity
生成するメソッド多重定義が受け付ける引数の最大数。
OverloadDispatcher コンセプト
OverloadDispatcher の X
とは、minimum arity と maximum arity を持つクラスであり、以下がそれぞれ OverloadDispatcher と同じ最大・最小引数長を持つ合法な overload-dispatch-expression
である。
X()
X(docstring)
X(docstring, keywords)
X(keywords, docstring)
X()[policies]
X(docstring)[policies]
X(docstring, keywords)[policies]
X(keywords, docstring)[policies]</programlisting>
policies
が与えられた場合、CallPolicies モデルの型でなければならず、結果の呼び出しポリシーとなる。それ以外の場合、結果の呼び出しポリシーはdefault_call_policies
のインスタンスである。docstring
が与えられた場合、ntbs でなければならず、結果のドキュメンテーション文字列となる。それ以外の場合、結果のドキュメンテーション文字列は空である。keywords が与えられた場合、長さが
X
の最大引数長以下であるkeyword-expression
の結果でなければならず、結果のキーワード引数列となる。それ以外の場合、結果のキーワード引数列は空である。
マクロ
BOOST_PYTHON_FUNCTION_OVERLOADS(name, func_id, min_args, max_args)
-
BOOST_PYTHON_FUNCTION_OVERLOADS(name, func_id, min_args, max_args)
現在のスコープで名前
name
の OverloadDispatcher の定義へ展開する。これは以下の関数呼び出し生成に使用できる(min_args <= i <= max_args
)。func_id(a1, a2,...ai);
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(name, member_name, min_args, max_args)
-
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(name, member_name, min_args, max_args)
現在のスコープで名前
name
の OverloadDispatcher の定義へ展開する。これは以下の関数呼び出し生成に使用できる(min_args <= i <= max_args
、x
はクラス型オブジェクトへの参照)。x.member_name(a1, a2,...ai);
例
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/args.hpp>
#include <boost/python/tuple.hpp>
#include <boost/python/class.hpp>
#include <boost/python/overloads.hpp>
#include <boost/python/return_internal_reference.hpp>
using namespace boost::python;
tuple f(int x = 1, double y = 4.25, char const* z = "wow")
{
return make_tuple(x, y, z);
}
BOOST_PYTHON_FUNCTION_OVERLOADS(f_overloads, f, 0, 3)
struct Y {};
struct X
{
Y& f(int x, double y = 4.25, char const* z = "wow")
{
return inner;
}
Y inner;
};
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_member_overloads, f, 1, 3)
BOOST_PYTHON_MODULE(args_ext)
{
def("f", f,
f_overloads(
args("x", "y", "z"), "これは f のドキュメンテーション文字列"
));
class_<Y>("Y")
;
class_<X>("X", "これは X のドキュメンテーション文字列")
.def("f1", &X::f,
f_member_overloads(
args("x", "y", "z"), "f のドキュメンテーション文字列"
)[return_internal_reference<>()]
)
;
}