이 오류 메시지가 나타나면 다소 놀랐습니다.오버로드 된 함수로 C++ int에 부스트 파이썬 'int'
TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'
는 내가 뭘하려고 오전 여러 가지 개체 형식을 취하도록 __lshift__
연산자를 오버로드 부스트 파이썬을 통해 클래스를 노출입니다 - 등 INT, 플로트, 숯불 *, 나는 제대로 클래스를 노출하고 있지만, packet << 10
과 같은 것을 시도 할 때 앞서 언급 한 오류가 발생합니다.
왜 그런지 이해하지만이 문제를 해결하는 방법을 정확히 모르겠습니다. 나는 정확히 boost :: python :: object로 오버로드를 가질 수 없다. 왜냐하면 packet << 10
과 packet << 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이고 나는 더 좋은 방법이 있기를 바랍니다.
제안 사항? 감사!