投稿したセグメントのコンテキストを見ずに確認するのは難しいですが、発生している問題は<<
の出力タイプにあるようです。 ストリームビルダーの演算子。ストリームビルダーの名前は実際には間違っています。 <<
の出力タイプとして、これは一般的なC++の意味での「ストリーム」ではありません。 演算子は、左側のオペランドとは異なる場合があります。特に、open_document
のようなものを使用するときはいつでも またはclose_document
、式が出力する型は、左側のオペランドとは異なります。このため、通常、これらの式の1つの出力を保存する必要があります。
このような場合にストリームビルダーが頻繁に引き起こす混乱のため、代わりに基本ビルダーを使用することをお勧めします。基本的なビルダーの構文はもう少し冗長ですが、微妙な間違いを犯すのははるかに難しく、間違いを犯した場合、コンパイラーのエラーメッセージははるかに理解しやすくなります。
基本的なビルダーを使用して同じドキュメントを作成する方法は次のとおりです。
#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
を取ります の(キーと値のペア)を作成し、ビルダーに追加します。文字列などの基本的なタイプの場合、2番目の引数として値を渡すことができます。サブドキュメントを作成するには、bsoncxx::builder::basic::sub_document
をとる2番目の引数としてラムダを使用します 次に、同じ方法でそのサブドキュメントビルダーに追加します。
ビルダーからドキュメントを取得するには、view()
を使用できます。 またはextract()
メソッド。 view()
bsoncxx::document::view()
を返します 、これはドキュメントの所有されていないビューです。ビューが使用されている間、ビルダーは存続している必要があります。 extract()
所有値であるbsoncxx::document::valueを返します。 extract()
の場合 が呼び出されると、ビルダーは空の状態にリセットされます。