c – 是否可以使用Boost.Hana进行反序列化?

c – 是否可以使用Boost.Hana进行反序列化?,第1张

概述我开始使用Boost.Hana,并想知道是否有一种方法可以反序列化为Boost.Hana已知的Struct. 我知道将这样的struct序列化为json字符串非常简单,但是我没有找到任何关于反过来的信息. 目前是不是可以用Boost.Hana反序列化数据或者我错过了什么? Hana是一个元编程库.它提供了可用于构建的工具 更复杂的功能,如序列化,但它没有提供这样的功能 功能本身.它根本不是该库的范 我开始使用Boost.Hana,并想知道是否有一种方法可以反序列化为Boost.Hana已知的Struct.
我知道将这样的struct序列化为Json字符串非常简单,但是我没有找到任何关于反过来的信息.
目前是不是可以用Boost.Hana反序列化数据或者我错过了什么?解决方法 Hana是一个元编程库.它提供了可用于构建的工具
更复杂的功能,如序列化,但它没有提供这样的功能
功能本身.它根本不是该库的范围.另外,关于
你的特定用例;解析不是一个容易的问题和其他库
像Boost.Spirit已经尝试解决它.

话虽这么说,我勾勒出一个使用Hana反序列化JSON的例子.
结果既不高效也不健壮,但它应该足以给予
你可以一瞥Hana如何用来实现更好的目标.解决
正确的这个问题需要实现一个解析器组合库
à-la Boost.Spirit,我不会在这里做.干得好:

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.

总结

以上是内存溢出为你收集整理的c – 是否可以使用Boost.Hana进行反序列化?全部内容,希望文章能够帮你解决c – 是否可以使用Boost.Hana进行反序列化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1256501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存