我怎样才能`nlohmann::json::get<std::shared_ptr<const T>>`?

How can I `nlohmann::json::get<std::shared_ptr<const T>>`?

我定义了以下序列化程序堆栈:

namespace discordpp {
using Snowflake = uint64_t;
}
namespace nlohmann {
template <> struct adl_serializer<discordpp::Snowflake> {
    static void to_json(json &j, const discordpp::Snowflake sf) {
        j = std::to_string(sf);
    }
    
    static void from_json(const json &j, discordpp::Snowflake sf) {
        std::istringstream(j.get<std::string>()) >> sf;
    }
};
template <typename T> struct adl_serializer<std::shared_ptr<T>> {
    static void from_json(json &j, std::shared_ptr<T> &ptr) {
        if (j.is_null()) {
            ptr == nullptr;
        } else {
            ptr = std::make_shared<T>(j.get<T>());
        }
    }
    static void to_json(json &j, const std::shared_ptr<T> &ptr) {
        if (ptr.get()) {
            j = *ptr;
        } else {
            j = nullptr;
        }
    }
};
template <typename T> struct adl_serializer<std::shared_ptr<const T>> {
    static void from_json(json &j, std::shared_ptr<const T> &ptr) {
        if (j.is_null()) {
            ptr == nullptr;
        } else {
            ptr = std::make_shared<const T>(j.get<T>());
        }
    }
    static void to_json(json &j, const std::shared_ptr<const T> &ptr) {
        if (ptr.get()) {
            j = *ptr;
        } else {
            j = nullptr;
        }
    }
};
template <typename T> struct adl_serializer<std::optional<T>> {
    static void to_json(json &j, const std::optional<T> &opt) {
        if (opt.has_value()) {
            j = nullptr;
        } else {
            j = *opt;
        }
    }

    static void from_json(const json &j, std::optional<T> &opt) {
        if (j.is_null()) {
            opt = std::nullopt;
        } else {
            opt = j.get<T>();
        }
    }
};
}

我正在研究这样的事情:

class MessageIn : protected util::ObjectIn {
  public:
    ...
    opt<sptr<const Snowflake>> guild_id;
    ...
}
void from_json(const json &j, MessageIn *m) {
    ...
    j["guild_id"].get<Snowflake>();
    j["guild_id"].get<const Snowflake>();
    j["guild_id"].get<sptr<const Snowflake>>();
    m->guild_id = j["guild_id"].get<opt<sptr<const Snowflake>>>();
    ...
}

我的编译器在带有 error: no matching function for call to ‘nlohmann::basic_json<>::get<discordpp::sptr<const long unsigned int> >() const’j["guild_id"].get<sptr<const Snowflake>>(); 行上抛出错误。我错过了什么吗?

不需要 std::shared_ptr<const T> 合成器。

在两个 std::shared_ptr 合成器的 from_json 方法中,json 参数不是静态的。