如果没有看到您发布的片段的上下文,很难确定,但看起来您遇到的问题与该片段的输出类型有关<<
流构建器上的运算符。流构建器实际上是错误命名的;它不是典型 C++ 意义上的“流”,因为它的输出类型<<
运算符有时会与左侧操作数不同。特别是,每当您使用类似的东西时open_document
or 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
的(键值对)并将它们附加到构建器。对于字符串等基本类型,您可以仅将值作为第二个参数传递。要构建子文档,请使用 lambda 作为第二个参数,该参数采用bsoncxx::builder::basic::sub_document
然后以相同的方式附加到该子文档生成器。
要从构建器中获取文档,您可以使用view()
or extract()
方法。view()
返回一个bsoncxx::document::view()
,这是文档的无主视图;构建器需要在视图使用的整个过程中保持活动状态。extract()
返回一个 bsoncxx::document::value,它是一个拥有的值;什么时候extract()
被调用时,构建器被重置回空状态。