2016-07-14 4 views
0

msgpack을 통해 다음 구조체를 보내고 싶습니다.msgpage C++ : MSGPACK_DEFINE을 사용하여 원시 포인터를 보내십시오.

struct MyStruct { 
    std::string  name{""}; 
    int*   val{nullptr}; 

    MSGPACK_DEFINE(name, val); 
}; 

지금까지 내 프로젝트, 내가 msgpack 다음 :: msgpack하는 sbuffer을 구조체를 작성 (및 보내기), MSGPACK_DEFINE을 사용하여 스트리밍 한 유일한 방법은 모든있다. MSGPACK_DEFINE 매크로는 아마도 "->"를 놓쳤다 고 불평하므로 포인터라고 감지하지 못합니다.

스마트 포인터는하지만 제대로 작동 :

struct MyStruct { 
    std::string   name{""}; 
    std::shared_ptr<int> val{nullptr}; 

    MSGPACK_DEFINE(name, val); 
}; 

주의해야 할 점은 다른 쪽 끝에있는 수신기가 원시 포인터로 발을 필요로한다는 것이다. 수신 측에서 변환하지 않고이 작업을하고 싶습니다. 어떤 아이디어?

답변

0

이유를 설명하지 못했습니다. 직렬화 될 때 포인터는 의미가 없습니다 (그렇지 않으면 직렬 데이터를 처리 할 필요가 없습니다).

포인터가 가리키는 값을 전달하십시오. "숫자 또는 NULL"을 표현할 필요가 있다면 정수와 부울을 포함하는 구조체를 전달하십시오.

struct NullableInt { 
    int value{0}; 
    bool null{true}; 
}; 
+0

그건 간단한 예일뿐입니다. 실제로 이것은 다른 구조체에 대한 포인터입니다. 나는 나무 구조를 보내고있다. 난 (어떻게 든) 그것을 직렬화 괜찮지 만 작동하지 않을 수도있는 모든 msgpack 매크로 또는 그것 주위의 방법을 모르고. 대답은 백 엔드에서 간단한 구조로 생각하고받는 쪽의 모든 포인터를 사용하여 모든 마법을 수행하는 것입니다. –

+0

다시 말씀 드리 자면, 포인터는 직렬화 될 때 결코 의미가 없습니다. –

+0

이것을 정리해 보겠습니다. 매크로가 포인터를 역 참조 (dereference)하고 의미있는 방식으로 나를 위해 직렬화 할 수 있는지 궁금합니다. 그것은 shared_ptr에 래핑 된 경우, 잘 작동합니다. –

관련 문제