Трудно е да сте сигурни, без да видите контекста на сегмента, който сте публикували, но изглежда, че проблемът, с който се сблъсквате, е с изходния тип на <<
оператор на конструктора на поток. Създателят на поток всъщност е погрешно именуван; това не е "поток" в типичния C++ смисъл на думата, като изходен тип на <<
понякога ще бъде различен от левия операнд. По-специално, когато използвате нещо като open_document
или close_document
, типът, който извежда изразът, ще бъде различен от това, което е операндът от лявата страна. Поради това обикновено ще трябва да съхраните изхода на един от тези изрази.
Поради объркването, което конструкторът на потоци често причинява в случаи като този, обикновено е за предпочитане вместо това да използвате основния конструктор. Въпреки че основният синтаксис на компилатора е малко по-подробен, е много по-трудно да направите фина грешка с него, а когато направите грешка, съобщенията за грешка на компилатора са много по-лесни за разбиране.
Ето как бихте изградили същия документ с основния конструктор:
#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
взема произволен брой kvp
(двойки ключ-стойност) и ги добавя към създателя. За основни типове като низове, можете просто да подадете стойността като втори аргумент. За да създадете поддокумент, използвайте ламбда като втори аргумент, който приема bsoncxx::builder::basic::sub_document
и след това добавете към този конструктор на поддокумент по същия начин.
За да получите документа от създателя, можете да използвате view()
или extract()
методи. view()
връща bsoncxx::document::view()
, което е непритежаван изглед на документа; строителят трябва да остане жив през цялото време, докато се използва изгледът. extract()
връща bsoncxx::document::value, която е притежавана стойност; когато extract()
се извиква, създателят се нулира обратно в празно състояние.