2012-12-11 2 views
0

나는 boost :: python으로 C++ 프레임 워크를 래핑 할 것이고 파이썬에서 C++ 메소드를 override 할 수있게 만들 필요가있다. 이것은 훅 (hook) 메소드로, 프레임 워크에서 필요하며 C++에서 기본 구현을 가지며, 매개 변수로 전달 된리스트를 반복하고 선택을 수행합니다. 선택한 요소 (반복자, 사실)에 포인터를 반환하여 선택을 명시된 때문에 문제가 발생하지만 파이썬 함수의 결과로 C++ 포인터를 반환 할 수있는 방법을 찾을 수 없습니다. 누구든지 도와 줄 수 있습니까?boost :: python에서 C++ 객체에 대한 포인터의 컨테이너를 취하고 그 중 하나에 대한 포인터를 반환하는 overrideable 함수를 래핑하는 방법은 무엇입니까?

감사합니다.

답변

0

이것은 가장 확실하게 할 수 있지만 세부 정보는 충분하지 않습니다. 정말 필요한 것은 파이썬 함수를 호출하고 파이썬 결과를 처리하고 C++ 결과를 반환하는 C++ 함수를 만드는 것입니다.

using boost::python; 
A* test(const std::string &foo) { 
    object module = import("mymodule"); 
    object func = module.attr("myfunc"); 
    // alternatively, you could set the function by passing it as an argument 
    // to a c++ function that you have wrapped 

    object result = func(foo); 
    int val = extract<int>(result); 
    return new A(val); // Assumes that you've wrapped A. 
} 
0
// file: https://github.com/layzerar/box2d-py/blob/master/python/world.cpp 
struct b2ContactFilter_W: b2ContactFilter, wrapper<b2ContactFilter> 
{ 
    bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) 
    { 
     override func = this->get_override("ShouldCollide"); 
     if (func) 
     { 
      return func(ref(fixtureA), ref(fixtureB)); //ref is boost::ref 
     } 
     return b2ContactFilter::ShouldCollide(fixtureA, fixtureB); 
    } 

    bool ShouldCollideDefault(b2Fixture* fixtureA, b2Fixture* fixtureB) 
    { 
     return b2ContactFilter::ShouldCollide(fixtureA, fixtureB); 
    } 
}; 

class_<b2ContactFilter_W, boost::noncopyable>("b2ContactFilter") 
     .def("ShouldCollide", &b2ContactFilter::ShouldCollide, &b2ContactFilter_W::ShouldCollideDefault) 
    ; 

이 당신이 필요로하는 무엇인가 : 의역 (의 내가 int를 문자열을 구문 분석하고 반환 일부 파이썬 함수를 가리키는 부스트 object라는 FUNC를 가정하자)?