boost/python/make_function.hpp
はじめに
make_function
および make_constructor
は、def
および class_<>::def
が C++ の関数およびメンバ関数をラップする Python の呼び出し可能オブジェクトを生成するのに内部的に使用する関数である。
関数
make_function
-
template<class F>
object make_function(F f) -
template<class F, class Policies>
object make_function(F f, Policies const &policies) -
template<class F, class Policies, class KeywordsOrSignature>
object make_function(F f, Policies const &policies, KeywordsOrSignature const &ks) -
template<class F, class Policies, class Keywords, class Signature>
object make_function(F f, Policies const &policies, Keywords const &kw, Signature const &sig) - 要件
F
は関数ポインタ、またはメンバ関数ポインタ型。policies
が与えられた場合、CallPolicies のモデルでなければならない。keywords
が与えられた場合、f
の引数長を超えないkeyword-expression
の結果でなければならない。- 効果
Python の呼び出し可能オブジェクトを作成する。このオブジェクトは Python から呼び出されると、引数を C++ に変換してfを呼び出す。
F
がメンバ関数へのポインタ型の場合、Python の第 1 引数が関数呼び出しの対象オブジェクト(*this)となり、残りの Python 引数はf
に対する引数となる。policies
が与えられた場合、ここに述べるとおり関数に適用する。keywords
が与えられた場合、結果の関数における最後の引数に適用する。Signature
が与えられた場合、MPL の先頭拡張可能列のインスタンスでなければならない。列の先頭が関数の戻り値型、後続が引数の型である。シグニチャが推論できない関数オブジェクト型をラップする場合や、ラップする関数に渡す型をオーバーライドしたい場合はSignature
を渡すとよい。
- 戻り値
新しい Python の呼び出し可能オブジェクトを保持する
object
のインスタンス。
注釈
ポインタ型の引数は、Python から
None
が渡された場合に0
となる可能性がある。const
な参照型の引数は、ラップした関数を呼び出す間だけに生存する Python オブジェクトから作成された一時オブジェクトを指す可能性がある。例えば Python のリストからの変換過程で生成したstd::vector
がそうである。永続的な lvalue が必要な場合は、非const
参照の引数を使うとよい。
make_constructor
-
template<class F>
object make_constructor(F f) -
template<class F, class Policies>
object make_constructor(F f, Policies const &policies) -
template<class F, class Policies, class KeywordsOrSignature>
object make_constructor(F f, Policies const &policies, KeywordsOrSignature const &ks) -
template<class F, class Policies, class Keywords, class Signature>
object make_constructor(F f, Policies const &policies, Keywords const &kw, Signature const &sig) - 要件
F
は関数ポインタ型。policies
が与えられた場合、CallPolicies のモデルでなければならない。keywords
が与えられた場合、f
の引数長を超えないkeyword-expression
の結果でなければならない。- 効果
Python から呼び出されると引数を C++ に変換して
f
を呼び出す、Python の呼び出し可能オブジェクトを作成する。- 戻り値
新しい Python の呼び出し可能オブジェクトを保持する
object
のインスタンス。
例
以下でエクスポートする C++ 関数は、2 つの関数のうち 1 つをラップする呼び出し可能オブジェクトを返す。
#include <boost/python/make_function.hpp>
#include <boost/python/module.hpp>
char const* foo() { return "foo"; }
char const* bar() { return "bar"; }
using namespace boost::python;
object choose_function(bool selector)
{
if (selector)
return boost::python::make_function(foo);
else
return boost::python::make_function(bar);
}
BOOST_PYTHON_MODULE(make_function_test)
{
def("choose_function", choose_function);
}
Python からは次のように使用する。
>>> from make_function_test import *
>>> f = choose_function(1)
>>> g = choose_function(0)
>>> f()
'foo'
>>> g()
'bar'