Если вы пытаетесь сделать что-то вроде этого:
typedef boost::function<void (string s) > funcptr;
void foo(funcptr fp)
{
fp("hello,world!");
}
BOOST_PYTHON_MODULE(test)
{
def("foo",foo);
}
А потом:
>>> def hello(s):
... print s
...
>>> foo(hello)
hello, world!
Короткий ответ: «Вы не можете». Это не повышение. Ограничение Python — это ограничение C++. Проблема в том, что функция Python — это фактически данные, и единственный способ ассоциировать данные с указателем функции C++ — это хранить его в статической переменной функции. Проблема в том, что вы можете связать только одну часть данных с каждой функцией C++, и у нас нет возможности компилировать новую функцию C++ на лету для каждой функции Python, которую вы решите передать<foo
>. Другими словами, это может сработать, если функция C++ всегда будет ссылаться на ту же функциюPython, но вы, вероятно, этого не хотите.
Если у вас есть возможность изменить код C++, который вы заворачиваете, передайте его<object
>и вызовите его; оператор вызова перегруженной функции вызовет функцию Python, которую вы передаете ему позади<object
>.