Как написать оболочку для функций и функций-членов, которая выполняет некоторый код до и после функции-оболочки?
Я пытаюсь написать некоторый класс-оболочку или функцию, которая позволяет мне выполнять некоторый код до и после упакованной функции.
float foo(int x, float y)
{
return x * y;
}
BOOST_PYTHON_MODULE(test)
{
boost::python::def("foo", <somehow wrap "&foo">);
}
В идеале оболочка должна быть универсальной, работать как для функций, так и для функций-членов с любой сигнатурой.
Больше информации:
Я ищу простой способ освободить / повторно получить GIL вокруг моих дорогих вызовов C ++ без необходимости писать тонкие обертки вручную, как это:
float foo_wrapper(int x, float y)
{
Py_BEGIN_ALLOW_THREADS
int result = foo(x, y);
Py_END_ALLOW_THREADS
return result;
}
BOOST_PYTHON_MODULE(test)
{
boost::python::def("foo", &foo_wrapper);
}
Этот вид оболочки будет повторяться несколько раз для всех видов функций, и я хотел бы найти решение, которое позволило бы мне избежать кодирования всех из них.
Я пробовал некоторые подходы, но лучшее, что я мог получить, требовало, чтобы пользователь явно указывал типы возвращаемых значений и параметров, например:
boost::python::def("foo", &wrap_gil<float, int, float>(&foo_wrapper));
Но мне кажется, что можно просто передать указатель на функцию (& foo_wrapper) и позволить компилятору определить типы.
Кто-нибудь знает технику, которую я мог бы использовать или указать мне в правильном направлении?
Ура!