c – 是否可以使用Boost.Hana进行反序列化?
发布时间:2020-12-16 03:32:10 所属栏目:百科 来源:网络整理
导读:我开始使用Boost.Hana,并想知道是否有一种方法可以反序列化为Boost.Hana已知的Struct. 我知道将这样的struct序列化为json字符串非常简单,但是我没有找到任何关于反过来的信息. 目前是不是可以用Boost.Hana反序列化数据或者我错过了什么? 解决方法 Hana是一
|
我开始使用Boost.Hana,并想知道是否有一种方法可以反序列化为Boost.Hana已知的Struct.
我知道将这样的struct序列化为json字符串非常简单,但是我没有找到任何关于反过来的信息. 目前是不是可以用Boost.Hana反序列化数据或者我错过了什么? 解决方法
Hana是一个元编程库.它提供了可用于构建的工具
更复杂的功能,如序列化,但它没有提供这样的功能 功能本身.它根本不是该库的范围.另外,关于 你的特定用例;解析不是一个容易的问题和其他库 像Boost.Spirit已经尝试解决它. 话虽这么说,我勾勒出一个使用Hana反序列化JSON的例子. template <typename T>
std::enable_if_t<std::is_same<T,int>::value,T> from_json(std::istream& in) {
T result;
in >> result;
return result;
}
template <typename T>
std::enable_if_t<std::is_same<T,std::string>::value,T> from_json(std::istream& in) {
char quote;
in >> quote;
T result;
char c;
while (in.get(c) && c != '"') {
result += c;
}
return result;
}
template <typename T>
std::enable_if_t<hana::Struct<T>::value,T> from_json(std::istream& in) {
T result;
char brace;
in >> brace;
hana::for_each(hana::keys(result),[&](auto key) {
in.ignore(std::numeric_limits<std::streamsize>::max(),':');
auto& member = hana::at_key(result,key);
using Member = std::remove_reference_t<decltype(member)>;
member = from_json<Member>(in);
});
in >> brace;
return result;
}
template <typename Xs>
std::enable_if_t<hana::Sequence<Xs>::value,Xs> from_json(std::istream& in) {
Xs result;
char bracket;
in >> bracket;
hana::length(result).times.with_index([&](auto i) {
if (i != 0u) {
char comma;
in >> comma;
}
auto& element = hana::at(result,i);
using Element = std::remove_reference_t<decltype(element)>;
element = from_json<Element>(in);
});
in >> bracket;
return result;
}
然后你可以像使用它一样 struct Car {
BOOST_HANA_DEFINE_STRUCT(Car,(std::string,brand),model)
);
};
struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,name),last_name),(int,age)
);
};
int main() {
std::istringstream json(R"EOS(
[
{
"name": "John","last_name": "Doe","age": 30
},{
"brand": "BMW","model": "Z3"
},{
"brand": "Audi","model": "A4"
}
]
)EOS");
auto actual = from_json<hana::tuple<Person,Car,Car>>(json);
auto expected = hana::make_tuple(Person{"John","Doe",30},Car{"BMW","Z3"},Car{"Audi","A4"});
assert(actual == expected);
}
完整示例可用于here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
