È difficile essere sicuri senza vedere il contesto del segmento che hai pubblicato, ma sembra che il problema che stai riscontrando riguardi il tipo di output di <<
operatore sul generatore di flussi. Il generatore di flussi in realtà ha un nome errato; non è un "flusso" nel tipico senso C++ della parola, come tipo di output di <<
l'operatore a volte sarà diverso dall'operando di sinistra. In particolare, ogni volta che usi qualcosa come open_document
o close_document
, il tipo che l'espressione restituisce sarà diverso da quello che è l'operando sul lato sinistro. Per questo motivo, generalmente dovrai memorizzare l'output di una di queste espressioni.
A causa della confusione che spesso causa lo stream builder in casi come questo, è generalmente preferibile utilizzare invece il basic builder. Sebbene la sintassi del builder di base sia un po' più dettagliata, è molto più difficile commettere un sottile errore e quando si commette un errore, i messaggi di errore del compilatore sono molto più facili da capire.
Ecco come creare lo stesso documento con il builder di base:
#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/builder/basic/kvp.hpp>
#include <bsoncxx/builder/basic/sub_document.hpp>
using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::sub_document;
bsoncxx::builder::basic::document doc;
// Build the document
doc.append(kvp("MainType", [](sub_document sub_doc1) {
sub_doc1.append(kvp("TLSRecord", [](sub_document sub_doc2) {
sub_doc2.append(kvp("type", "16"),
kvp("version", "0301"),
kvp("length", "012C"),
kvp("hsMsg", [](sub_document sub_doc3) {
sub_doc3.append(kvp("type", "01"),
kvp("length", "000128"),
kvp("clientHello", [](sub_document sub_doc4) {
sub_doc4.append(
kvp("version", "0303"),
kvp("random", "40C70E243001B96D8C"),
kvp("session_id_length", ""));
}));
}));
}));
}));
// Get a view of the document being built and do something with it.
do_something_with_document_view(doc.view());
// Extract the document from the builder and do something with it.
do_something_with_owned_document(doc.extract());
bsoncxx::builder::basic::document::append
prende un numero arbitrario di kvp
's (coppie chiave-valore) e le aggiunge al builder. Per i tipi di base come le stringhe, puoi semplicemente passare il valore come secondo argomento. Per creare un documento secondario, usa un lambda come secondo argomento che accetta un bsoncxx::builder::basic::sub_document
e quindi aggiungi a quel generatore di documenti secondari allo stesso modo.
Per estrarre il documento dal builder, puoi utilizzare il view()
o extract()
metodi. view()
restituisce un bsoncxx::document::view()
, che è una vista non di proprietà del documento; il costruttore deve rimanere in vita per tutto il tempo in cui viene utilizzata la vista. extract()
restituisce un bsoncxx::document::value, che è un valore di proprietà; quando extract()
viene chiamato, il builder viene riportato allo stato vuoto.