Я пытаюсь создать массив с содержанием вектора
using bsoncxx::builder::stream;
auto doc = document{};
doc << "foo"<< open_array;
for (auto i : v){
doc << open_document << "bar" << i << close_document ;
}
doc << close_array;
Я получаю следующее сообщение об ошибке:
error: no match for ‘operator<<’ (operand types are ‘bsoncxx::v0::builder::stream::document’ and ‘const bsoncxx::v0::builder::stream::open_document_type’)
doc << open_document << "bar" << i << close_document ;
Есть идеи, как это сделать?
Драйвер bson для C ++ 11 на самом деле скрывает немного больше сложности под API стилевого стиля, чем кажется на первый взгляд.
Проблема, с которой вы сталкиваетесь, заключается в том, что в каждом последующем выражении есть информация о типе, закодированная в выражении ‘<<‘, так что из вашего исходного примера вам нужно:
auto sz = 100;
// Note that we capture the return value of open_array
auto arr = doc << "foo" << open_array;
for (int32_t i=0; i < sz; i++)
arr << i;
arr << close_array;
Это потому, что open_array создает вложенный тип, который может принимать значения без ключей, в отличие от doc, для которого нужны пары ключ-значение.
Если вы хотите что-то более встроенное, вы можете использовать встроенное средство Callable, как в:
auto sz = 100;
builder::stream::document doc;
doc << "foo" << open_array <<
[&](array_context<> arr){
for (int32_t i = 0; i < sz; i++)
arr << i;
} // Note that we don't invoke the lambda
<< close_array;
Вызываемое средство работает с вещами, которые принимают:
single_context — записать одно значение в массив или как часть значения пары ключ-значение
key_context<> — написать любое количество пар ключ-значение
array_context<> — напишите любое количество значений
Смотрите src / bsoncxx / test / bson_builder.cpp для большего количества примеров
У меня та же проблема с потоковым компоновщиком.
using bsoncxx::builder::stream;
auto doc = document{};
doc << "foo"<< open_array
<< open_document
<< "bar1" << 1
<< "bar2" << 5
<< close_document
<< close_array;
Выше работает, но если вы хотите сделать следующее, это не работает
doc << "foo"<< open_array;
for (size_t i=0; i < sz; i++)
doc << i;
doc << close_array;
Я получаю ошибку ниже. Проблема в том, что такое поведение при использовании построителя потоков практически бесполезно. Возможно, это ошибка, или ребята из 10gen не закончили с этой частью API.
doc << closerror: no match for ‘operator<<’ (operand types are ‘bsoncxx::v0::builder::stream::document’ and ‘const bsoncxx::v0::builder::stream::open_document_type’) doc << open_document << "bar" << i << close_document ;e_array;