Je těžké si být jisti, aniž byste viděli kontext segmentu, který jste zveřejnili, ale zdá se, že problém, na který narazíte, je s typem výstupu <<
operátor na staviteli streamu. Tvůrce proudu je ve skutečnosti nesprávně pojmenován; není to "stream" v typickém smyslu slova C++, jako výstupní typ <<
operátor bude někdy jiný než levý operand. Zejména vždy, když použijete něco jako open_document
nebo close_document
, typ výstupu výrazu bude jiný, než jaký je levý operand. Z tohoto důvodu budete obecně muset uložit výstup jednoho z těchto výrazů.
Kvůli zmatkům, které v případech, jako je tento, často způsobuje tvůrce streamů, je obecně vhodnější místo toho použít základní tvůrce. I když je syntaxe základního stavitele trochu podrobnější, je mnohem těžší v ní udělat drobnou chybu, a když uděláte chybu, chybové zprávy kompilátoru jsou mnohem srozumitelnější.
Zde je návod, jak byste vytvořili stejný dokument se základním tvůrcem:
#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
bere libovolný počet kvp
's (páry klíč–hodnota) a připojí je k staviteli. U základních typů, jako jsou řetězce, můžete hodnotu pouze předat jako druhý argument. Chcete-li vytvořit vnořený dokument, použijte lambda jako druhý argument, který přebírá bsoncxx::builder::basic::sub_document
a poté stejným způsobem připojte k tomuto tvůrci vnořených dokumentů.
Chcete-li získat dokument z tvůrce, můžete použít view()
nebo extract()
metody. view()
vrátí bsoncxx::document::view()
, což je nevlastněné zobrazení dokumentu; stavitel musí zůstat naživu po celou dobu použití pohledu. extract()
vrátí bsoncxx::document::value, což je vlastněná hodnota; když extract()
je zavolán, stavitel je resetován zpět do prázdného stavu.