2016-07-14 16 views
0

Ich möchte die folgende Struktur über msgpack senden.msgpage C++: send roher Zeiger mit MSGPACK_DEFINE

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

    MSGPACK_DEFINE(name, val); 
}; 

So weit in alle meine Projekte, die einzige Art, wie ich mit msgpack gestreamt haben MSGPACK_DEFINE verwendet, dann die Struktur schriftlich msgpack :: sbuffer (und sendet es). der MSGPACK_DEFINE-Makro beschwert sich, dass ich vielleicht das "->" verpasst habe, also vermute ich, dass es nicht erkennt, dass es ein Zeiger ist.

Intelligente Zeiger scheinen allerdings zu arbeiten:

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

    MSGPACK_DEFINE(name, val); 
}; 

Der Nachteil ist, dass der Empfänger am anderen Ende val ein Rohzeiger sein muss. Ich möchte das ohne Konvertierung auf der Empfängerseite machen. Irgendwelche Ideen?

Antwort

0

Sie konnten nicht erklären, warum Sie dies tun möchten. Zeiger sind bei der Serialisierung niemals sinnvoll (andernfalls sind es In-Process-Daten und es ist nicht notwendig, sie zu serialisieren).

Übergeben Sie einfach den Wert, auf den der Zeiger zeigt. Wenn Sie "eine Zahl oder NULL" darstellen müssen, übergeben Sie eine Struktur, die eine Ganzzahl und einen Booleschen Wert enthält.

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

Das war nur ein einfaches Beispiel. In der Praxis ist es tatsächlich ein Zeiger auf andere Strukturen. Ich sende eine Baumstruktur. Ich bin in Ordnung mit der Serialisierung (irgendwie), aber keine Ahnung von irgendeinem msgpack Makro, das funktionieren könnte, oder ein Weg darum. Ich denke, die Antwort ist eine einfachere Struktur am Backend und macht dann die ganze Magie mit den rohen Zeigern auf der Empfängerseite. –

+0

Lassen Sie mich wiederholen: Zeiger sind nie sinnvoll, wenn sie serialisiert werden. –

+0

Lassen Sie mich das aufklären: Ich frage mich, ob das Makro den Zeiger dereferenzieren und es für mich auf eine sinnvolle Weise serialisieren kann. Wenn es in einem shared_ptr eingeschlossen ist, funktioniert es gut. –