Trudno mieć pewność, nie widząc kontekstu opublikowanego segmentu, ale wygląda na to, że napotkany problem dotyczy typu wyjściowego <<
operatora w konstruktorze strumienia. W rzeczywistości konstruktor strumienia ma błędną nazwę; nie jest to „strumień” w typowym dla C++ znaczeniu tego słowa, jako typ wyjściowy <<
operator będzie czasem inny niż operand po lewej stronie. W szczególności, gdy używasz czegoś takiego jak open_document
lub close_document
, typ, który wyprowadza wyrażenie, będzie inny niż operand po lewej stronie. Z tego powodu zazwyczaj będziesz musiał przechowywać dane wyjściowe jednego z tych wyrażeń.
Ze względu na zamieszanie, które często powoduje konstruktor strumieni w takich przypadkach, ogólnie lepiej jest zamiast tego używać podstawowego konstruktora. Podczas gdy podstawowa składnia konstruktora jest nieco bardziej szczegółowa, znacznie trudniej jest popełnić w niej subtelny błąd, a gdy popełnisz błąd, komunikaty o błędach kompilatora są znacznie łatwiejsze do zrozumienia.
Oto jak zbudować ten sam dokument za pomocą podstawowego kreatora:
#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
przyjmuje dowolną liczbę kvp
's (par klucz-wartość) i dołącza je do konstruktora. W przypadku typów podstawowych, takich jak ciągi, możesz po prostu przekazać wartość jako drugi argument. Aby zbudować poddokument, użyj lambda jako drugiego argumentu, który przyjmuje bsoncxx::builder::basic::sub_document
a następnie dołącz do tego kreatora poddokumentów w ten sam sposób.
Aby pobrać dokument z kreatora, możesz użyć view()
lub extract()
metody. view()
zwraca bsoncxx::document::view()
, który jest widokiem dokumentu bez właściciela; budowniczy musi pozostać przy życiu przez cały czas korzystania z widoku. extract()
zwraca bsoncxx::document::value, która jest wartością posiadaną; kiedy extract()
zostanie wywołany, budowniczy zostanie zresetowany do stanu pustego.