Как написать оболочку для функций и функций-членов, которая выполняет некоторый код до и после функции-оболочки?

Я пытаюсь написать некоторый класс-оболочку или функцию, которая позволяет мне выполнять некоторый код до и после упакованной функции.

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) и позволить компилятору определить типы.

Кто-нибудь знает технику, которую я мог бы использовать или указать мне в правильном направлении?

Ура!

Ответы на вопрос(2)

Ваш ответ на вопрос