You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:21:02