Распаковка boost :: function из boost :: python :: object с извлечением

Как я могу вызвать функции модуля C ++ из C ++, но выбрать функцию из python? Смотрите пример ниже

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

Я также хотел бы, чтобы он был очень эффективным, надеюсь, в основном разворачивая boost :: python :: object и извлекая boost :: function<> Из этого.

Вот файл с питоном

import stackoverflow #this is a C++ module I wrote

t = stackoverflow.TestClass()
t.Reference()                      # time invoking a boost::function 100k times
t.CallSomeClassMemberFunction(t.a) # instead of choosing a function directly, i want to pass in which function I want to invoke from python

Код модуля C ++ (компилируется, но не запускается .. вы можете видеть мои намерения):

#include <sys/time.h>
#include <stdlib.h>
#include <boost/function.hpp>
#include <boost/python.hpp>

struct TestClass
{
TestClass() { }

int a() const { return rand()%4; }
int b() const { return rand()%64; }

template<typename T>
void BenchMark(T & aUnknownFunction)
{
timeval begin, end;
long long sum(0);
gettimeofday(&begin, NULL);
__asm__ __volatile__ ("cpuid");
for (int x(0); x!=100000; ++x)
sum += aUnknownFunction();
__asm__ __volatile__ ("cpuid");
gettimeofday(&end, NULL);

std::cout << "Time: " << 1000000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;
srand(sum);
}

void CallSomeClassMemberFunction(boost::python::object &aTest)
{
boost::function<int ()> unknownFunction =  boost::python::extract<boost::function<int ()> >(aTest) ;  // i don't think this works as I want
BenchMark( unknownFunction );
}

void Reference()
{
boost::function<int ()> unknownFunction = boost::bind(&TestClass::a, this);
BenchMark( unknownFunction );
}
};BOOST_PYTHON_MODULE(stackoverflow)
{
boost::python::class_<TestClass>("TestClass")
.def("a",&TestClass::a)
.def("b",&TestClass::b)
.def("CallSomeClassMemberFunction",&TestClass::CallSomeClassMemberFunction)
.def("Reference",&TestClass::Reference)
;
}

Если вы можете заставить его работать, хотелось бы также увидеть ваши сроки.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …