저는 Boost.Python을 사용하여 C++ 클래스에서 파이썬 모듈을 작성하고 있습니다. 그리고 나는 참고 문헌에 문제가 생겼다.Boost.Python - 참조로 돌아 오는 방법?
다음 경우에 값 또는 참조로 반환 할 수있는 오버로드 된 get 메서드가있는 Foo 클래스가 있습니다.
서명을 typedef 한 후에 값으로 반환을 사용해야한다고 지정하는 것이 쉬웠습니다. 하지만 return_value_policy
을 사용하면 참조를 반환 할 수 있어야한다고 생각합니다. 그러나 적절한 것으로 보이는 것을 사용하십시오 (doc); return_value_policy<reference_existing_object>
가 작동하지 않는 것 같습니다.
나는 그것이 무엇을 잘못 이해 했습니까?
struct Foo {
Foo(float x) { _x = x; }
float& get() { return _x; }
float get() const { return _x; }
private:
float _x;
};
// Wrapper code
BOOST_PYTHON_MODULE(my_module)
{
using namespace boost::python;
typedef float (Foo::*get_by_value)() const;
typedef float& (Foo::*get_by_ref)();
class_<Foo>("Foo", init<float>())
.def("get", get_by_value(&Foo::get))
.def("get_ref", get_by_ref(&Foo::get),
return_value_policy<reference_existing_object>())//Doesn't work
;
}
참고 : 평생 관리하지 않고 기존 개체를 참조하는 것은 위험 할 수 있음을 알고 있습니다.
업데이트 : 그것은 기본 데이터 유형을 객체에 대한 작동하지만 같은
것 같습니다.
이 개정을 예로 들어 보겠습니다 : 테스트에서 예상되는 결과 준
struct Foo {
Foo(float x) { _x = x; }
float& get() { return _x; }
float get() const { return _x; }
void set(float f){ _x = f;}
Foo& self(){return *this;}
private:
float _x;
};
// Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(my_module)
{
typedef float (Foo::*get_by_value)() const;
class_<Foo>("Foo", init<float>())
.def("get", get_by_value(&Foo::get))
.def("get_self", &Foo::self,
return_value_policy<reference_existing_object>())
.def("set", &Foo::set);
;
}
:
>>> foo1 = Foo(123)
>>> foo1.get()
123.0
>>> foo2 = foo1.get_self()
>>> foo2.set(1)
>>> foo1.get()
1.0
>>> id(foo1) == id(foo2)
False
그래, 나는 모든 것이 파이썬에서 참조된다는 것을 알고있다. Boost.Python으로 "값으로"반환하는 파이썬 메소드를 만들면 그 타입의 복사본을 반환합니다. 내가하고 싶은 것은 * 복사하지 않고 같은 인스턴스에 대한 참조를 만드는 것입니다. – mandrake