gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:57 25 4
gpt4 key购买 nike

我开始使用 Boost.Hana,想知道是否有一种方法可以反序列化回 Boost.Hana 已知的结构。我知道将这样的 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),
(std::string, model)
);
};

struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(std::string, 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 进行反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com