2012-06-16 2 views
1

이 오류 메시지가 나타나면 다소 놀랐습니다.오버로드 된 함수로 C++ int에 부스트 파이썬 'int'

TypeError: unsupported operand type(s) for <<: 'Packet' and 'int' 

는 내가 뭘하려고 오전 여러 가지 개체 형식을 취하도록 __lshift__ 연산자를 오버로드 부스트 파이썬을 통해 클래스를 노출입니다 - 등 INT, 플로트, 숯불 *, 나는 제대로 클래스를 노출하고 있지만, packet << 10과 같은 것을 시도 할 때 앞서 언급 한 오류가 발생합니다.

왜 그런지 이해하지만이 문제를 해결하는 방법을 정확히 모르겠습니다. 나는 정확히 boost :: python :: object로 오버로드를 가질 수 없다. 왜냐하면 packet << 10packet << 10.5을 구분할 수 없기 때문이다.

가능한 해결책 중 하나는 __lshift__ 이외의 다른 기능으로 노출하는 것입니다. 그런 다음 packet.saveInt(10)packet.saveFloat(10.5)으로 끝날 수 있지만 파이썬에서 우리가 존경하는 구문상의 설탕을 파괴합니다.

내가 가진 또 다른 아이디어는 내가 내장 유형 INT 주위에 매우 얇은 클래스를 만들고에 그 걸릴 수있다.이와

struct Int32 { 
    Int32(bp::object obj) { 
     if (PyInt_Check(obj.get()) { 
      value = bp::extract<int>(obj); 
     } 
     PyErr_SetObject(PyExc_ValueError, obj); 
     bp::throw_error_already_set(); 
    } 
    int value; 
} 

BOOST_PYTHON_MODULE(intwrapper) 
{ 
     bp::class_<Int32>("Int32", bp::init<bp::object>) 
      .def("value", &Int32::value); 
} 

을 나는 다음을 수행 한 후 수 있었다. packet << Int32(10) 및 이와 유사하게 packet << Float(10.5). 이것은 일종의 hackish이고 나는 더 좋은 방법이 있기를 바랍니다.

제안 사항? 감사!

답변

0

더 많은 조사가 끝나면 참조를 통해 int를 전달하려고했는데 파이썬이이를 지원하지 않는다는 것을 발견했습니다.

나는 설탕을 지키기 위해 최선을 다했지만 결국 saveInt32 (value), saveString (value), loadInt32(), loadString()과 같은 다른 연산자 < < 등등.

관련 문제