У меня есть следующий код для создания объекта значения Boost::Json.
void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AppointmentEnd const& obj)
{
jv = { { "MridianPatientOid", obj.mridianPatientOid }, { "PdfOids", obj.pdfOids } };
}
Он отлично работает с Boost версии 1.79.
Я пытаюсь обновить Boost до версии 1.86, но выдает следующую ошибку:
C:\Users\bobef\.conan2\p\b\boost8a406c6ccf4da\p\include\boost\json\impl\value_ref.hpp(36): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'boost::json::value'
...
C:\projects\work\mercury\libs\ois-data\code\ois-data\models\states\AppointmentEnd.cpp(16): note: see reference to function template instantiation 'boost::json::value_ref::value_ref<std::vector<std::string,std::allocator<std::string>>>(const T &,void *) noexcept' being compiled
with
[
T=std::vector<std::string,std::allocator<std::string>>
]
C:\Users\bobef\.conan2\p\b\boost8a406c6ccf4da\p\include\boost/json/value_ref.hpp(204): note: see reference to function template instantiation 'boost::json::value boost::json::value_ref::from_const<std::vector<std::string,std::allocator<std::string>>>(const void *,boost::json::storage_ptr)' being compiled
ninja: build stopped: subcommand failed.
Я могу использовать следующий обходной путь, но он длинный и некрасивый.
void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AppointmentEnd const& obj)
{
boost::json::object obj_;
obj_["MridianPatientOid"] = obj.mridianPatientOid;
obj_["PdfOids"] = array(obj.pdfOids.begin(), obj.pdfOids.end());
jv = obj_;
}
Я использую версию компилятора Microsoft Visual Studio Community 2022 (64-bit) Version 17.11.2
.
Может ли кто-нибудь объяснить источник ошибки и предложить более компактное решение?
Ваш инициализатор включает obj.pdfOids
в качестве значения. Вероятно, это контейнер, и поэтому его нельзя неявно преобразовать в json::value
. Вместо этого снова используйте value_from
:
#include <boost/json.hpp>
#include <iostream>
namespace json = boost::json;
struct AppointmentEnd {
std::string mridianPatientOid;
std::vector<std::string> pdfOids;
private:
friend void tag_invoke(json::value_from_tag, json::value& jv, AppointmentEnd const& obj) {
jv = {
{"MridianPatientOid", obj.mridianPatientOid},
{"PdfOids", json::value_from(obj.pdfOids)},
};
}
};
int main() {
std::cout << json::value_from(AppointmentEnd{ "ABC", {"pdfOid1", "pdfOid2"} });
}
Печать
{"MridianPatientOid":"ABC","PdfOids":["pdfOid1","pdfOid2"]}
Да, до определенного момента версия value_from
ошибочно считалась конструкторами. Я согласен, что в некоторых случаях это было изящно, но изменение было намеренным. Я уверен, что видел это в журнале изменений/истории коммитов.
Вы проверяли трекер ошибок Boost? А как насчет примечаний к выпуску и примеров/тестов?