Thật khó để chắc chắn nếu không nhìn thấy ngữ cảnh của phân đoạn bạn đã đăng, nhưng có vẻ như vấn đề bạn đang gặp phải là với loại đầu ra của <<
toán tử trên trình tạo luồng. Trình tạo luồng thực sự bị đặt tên sai; nó không phải là "dòng" theo nghĩa C ++ điển hình của từ này, như kiểu đầu ra của <<
toán tử đôi khi sẽ khác với toán hạng bên trái. Đặc biệt, bất cứ khi nào bạn sử dụng một cái gì đó như open_document
hoặc close_document
, kiểu mà biểu thức xuất ra sẽ khác với kiểu toán hạng bên trái. Do đó, bạn thường cần lưu trữ kết quả đầu ra của một trong những biểu thức đó.
Do sự nhầm lẫn mà trình tạo luồng thường gây ra trong những trường hợp như thế này, nên thay vào đó, bạn nên sử dụng trình tạo cơ bản. Mặc dù cú pháp của trình tạo cơ bản dài dòng hơn một chút, nhưng việc mắc lỗi nhỏ với nó sẽ khó hơn nhiều và khi bạn mắc lỗi, thông báo lỗi của trình biên dịch sẽ dễ hiểu hơn nhiều.
Đây là cách bạn tạo cùng một tài liệu với trình tạo cơ bản:
#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
lấy một số kvp
tùy ý của (cặp khóa-giá trị) và gắn chúng vào trình tạo. Đối với các kiểu cơ bản như chuỗi, bạn chỉ có thể chuyển giá trị làm đối số thứ hai. Để tạo một tài liệu con, hãy sử dụng lambda làm đối số thứ hai lấy bsoncxx::builder::basic::sub_document
và sau đó thêm vào trình tạo tài liệu phụ đó theo cùng một cách.
Để lấy tài liệu ra khỏi trình tạo, bạn có thể sử dụng view()
hoặc extract()
các phương pháp. view()
trả về một bsoncxx::document::view()
, đó là một chế độ xem tài liệu chưa được biết đến; trình xây dựng cần duy trì hoạt động trong toàn bộ thời gian chế độ xem được sử dụng. extract()
trả về một bsoncxx ::document ::value, là một giá trị thuộc sở hữu; khi extract()
được gọi, trình tạo được đặt lại trở lại trạng thái trống.