【问题标题】:How can I `nlohmann::json::get<std::shared_ptr<const T>>`?我怎样才能`nlohmann::json::get<std::shared_ptr<const T>>`?
【发布时间】:2021-01-12 02:57:34
【问题描述】:

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

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&lt;&gt;::get&lt;discordpp::sptr&lt;const long unsigned int&gt; &gt;() const’j["guild_id"].get&lt;sptr&lt;const Snowflake&gt;&gt;(); 行上抛出错误。我错过了什么吗?

【问题讨论】:

标签: c++ parsing templates shared-ptr nlohmann-json


【解决方案1】:

不需要std::shared_ptr&lt;const T&gt; 合成器。

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

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多