최근에 상황에 대해 설명하고 싶습니다. 질문을하기 위해 상황을 설명하고 싶습니다.기지를 정해지지 않은 크기의 객체로 설정하십시오.
저는 파이썬 C++ 래퍼를 작성하고 있습니다. Python의 기본 단위는 PyObject입니다. Python의 모든 엔티티는 PyObject + 더 많은 옵션 항목입니다.
즉, 첫 번째 sizeofPyObject)
바이트는 PyObject의 필드를 채우는 것이 보장되지만 다양한 객체는 연속적인 추가 메모리를 할당 할 수 있습니다.
이점 (이유?)은 무엇이든 의미있는 PyObject
으로 다시 유형 변환 될 수 있다는 것입니다.
class CxxWrapper : PyObject {}
가 나는
void foo(PyObject* p)
을 만들 말, 그리고 파이썬 런타임의 함수 포인터 테이블 중 하나에
foo
를 삽입 : 나는 시도하고있어
는 짐승을 포장합니다.
그런 다음 런타임은 관련 함수 (PyObject
)에 대한 포인터를 전달하는이 함수를 (어떤 이유로 든) 트리거합니다.
나는 곧장 해당 CxxWrapper 객체에이 캐스트 할 수 있도록하고 싶습니다 :
CxxWrapper* cxxw = static_cast<CxxWrapper>p;
그러나,이 메커니즘이 작동하도록 할 수있는 방법을 볼 수 없습니다. 기본 객체를 어떤 값으로 설정하는 방법이 보이지 않기 때문에 PyObjectPlusExtra
.
이렇게 할 방법이 있습니까? 그렇다면 C++의 한계점은 무엇입니까?
당신은 확실히 다음 기본 클래스 또는 첫 번째 멤버가의 PyObject로되어있는 몇 가지 클래스를 선언 할 수 있습니다 다른 회원이 따라옵니다. –
'CxxWrapper * cxxw = static_cast (p); ' –
@JonathanPotter하지만 CxxWrapper의 자체 생성자는 파생 된 개체를 생성 할 기회를 얻지 못합니다. –