2013-07-31 1 views
2

std :: string보다는 오히려 커스텀 String 구현을 다루는 코드를 작성하고 있습니다. 여기에서 "문자열"로 참조됩니다.msgpack_define없이 임의의 객체에 msgpack의 압축을 풉니 다

"raw"형식을 사용하여 문자열을 쉽게 팩할 수 있었지만 원시 char 바이트와 크기를 압축했지만 문제를 풀고 있습니다.

아래와 같이 수동으로 압축을 풀 수있었습니다.

// before this I've unpacked to the point where the following object has the string 
msgpack::object_kv& kv = obj.via.map.ptr[0]; 
// kv.key == the String I want 
String key = String(key.via.raw.ptr, key.via.raw.size); // this works 

그러나 내장 >> 연산자 또는 .as 템플릿 함수를 사용하고 관리 할 수 ​​없었습니다. String 클래스를 수정하여 msgpack_unpack 함수를 추가하거나 MSGPACK_DEFINE을 추가 할 필요가 없습니다.

구조체를 생성하고 msgpack_unpack 함수를 사용하려고했지만 msgpack :: object :: implicit_type 내 컴파일러는

error: 'struct msgpack::object::implicit_type' is private 

로 응답 그리고 나는 "implicit_type"개체 밖으로 msgpack :: 객체를 얻기의 어떤 방법을 알아낼 수 없습니다.

아이디어가 있으십니까?

+1

어쩌면이 작업을 수행 할 수 있습니다'문자열 & 연산자 >> (문자열, yourtype)'클래스의 구성원 대신에 구현 된 클래스 – hetepeperfan

+0

또 다른 모습을 취한 후 나는 마침내 왜 연산자 >>에서 내 시도가 작동하지 않았다 나는 완전한 결과를 가지고 질문에 대답 할 것이다. – Zeroshade

답변

2

그래서 알아 냈습니다! 이 아이디어에 대한 hetepeperfan 덕분에

연산자 오버로드를 사용하여 또 다른 문제를 해결 한 후에 연산자 >> 오버로드가 이상한 방법으로 작동하지 못하게하는 문제가 msgpack 코드에서 호출되었습니다. 나는 모두에 필요한

namespace msgpack { 
    String& operator>>(msgpack::object o, String& v) { 
     v = String(o.via.raw.ptr, o.via.raw.size); 
     return v; 
    } 
} 

는 msgpack 네임 스페이스를 사용하고, 참조로 문자열을 반환하여 서명과 일치 참조로 하지에서 개체를 가져 가라. 이것은 약간 우스운 것처럼 보이지만 작동하고 이제는 "as <>"으로 빌드를 사용하고 기능을 변환 할 수 있습니다. 굉장해!