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'