如何用Boost Describe将含指针成员的结构体转换为JSON
处理Boost Describe结构体指针成员转JSON的解决方案
原Boost Describe转JSON的示例代码未处理指针类型,导致结构体包含指针成员时无法正常转换。解决核心是为指针类型扩展tag_invoke重载,补充指针的转换逻辑,同时处理空指针避免崩溃。
完整解决方案代码
#include <boost/describe.hpp> #include <boost/json.hpp> #include <boost/mp11.hpp> #include <iostream> #include <type_traits> namespace app{ // 处理普通结构体(保留原示例逻辑) template < class T, class D1 = boost::describe::describe_members< T, boost::describe::mod_public | boost::describe::mod_protected>, class D2 = boost::describe::describe_members<T, boost::describe::mod_private>, class En = std::enable_if_t<boost::mp11::mp_empty<D2>::value && !std::is_union<T>::value> > void tag_invoke(boost::json::value_from_tag const&, boost::json::value& v, T const& t) { auto& obj = v.emplace_object(); boost::mp11::mp_for_each<D1>( [&](auto D) { obj[D.name] = boost::json::value_from(t.*D.pointer); }); } // 处理非const指针类型 template <class T> void tag_invoke(boost::json::value_from_tag const&, boost::json::value& v, T* ptr) { if (ptr) { v = boost::json::value_from(*ptr); } else { v = boost::json::value(nullptr); // 空指针转为JSON null } } // 处理const指针类型 template <class T> void tag_invoke(boost::json::value_from_tag const&, boost::json::value& v, T const* ptr) { if (ptr) { v = boost::json::value_from(*ptr); } else { v = boost::json::value(nullptr); } } // 测试用例 int b = 42; struct A { int* i; int const* j; }; BOOST_DESCRIBE_STRUCT(A, (), (i, j)); A a{&b, nullptr}; } int main() { std::cout << boost::json::value_from(app::a) << std::endl; // 输出: {"i":42,"j":null} return 0; }
关键说明
- 新增的两个
tag_invoke重载分别处理非const和const指针类型,覆盖所有常见指针场景。 - 转换逻辑中先判断指针是否为空:非空则解引用后调用
value_from转换为对应JSON值;空指针则转为JSON的null,避免访问空地址导致崩溃。 - 原结构体的转换逻辑保持不变,仅补充指针类型的处理,不影响原有非指针成员的转换。
内容的提问来源于stack exchange,提问作者Koija
相关产品推荐
相关产品推荐

