c++ 通过引用传递 json 对象

c++ passing json object by reference

在下面的代码中,我从客户端接收请求,将它们放在我的服务器 class 上的 json 对象上,并将其发送到推送器(直接连接到网站,把我的数据放在那里,这样我就可以轻松地搜索数据) 代码运行良好,但我的经理说我需要在此代码中通过引用传递 json,我不知道该怎么做。 在服务器 Class:

grpc::Status RouteGuideImpl::PubEvent(grpc::ServerContext *context, 
                    const events::PubEventRequest *request, 
                    events::PubEventResponse *response){
    for(int i=0; i<request->event_size();i++){
    nhollman::json object;
    auto message = request->events(i);
    object["uuid"]=message.uuid();
    object["topic"]=message.type();
    pusher.jsonCollector(obj);
    }
    ...
}

在推手上 Class:

private:
    nholmann::json queue = nlohmann::json::array();
public:
    void Pusher::jsonCollector(nlohmann::json dump){
        queue.push_back(dump);
    }
    void Pusher::curlPusher(){
        std::string str = queue.dump();
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, str.data());
...
}

据我所知,我需要通过引用发送 json 对象。我该怎么做?

简单的答案就是改变

void Pusher::jsonCollector(nlohmann::json dump)

void Pusher::jsonCollector(const nlohmann::json& dump)

(请注意,如果它位于 class 内,则 Pusher:: 是 non-standard visual studio 扩展)。

这会将对象复制的次数从 2 次减少到 1 次,但是您可以使用 std::move:

完全避免复制
void Pusher::jsonCollector(nlohmann::json dump){
        queue.push_back(std::move(dump));
    }

并调用它:

pusher.jsonCollector(std::move(obj));

如果您想强制执行此行为以确保 jsonCollector 的调用者始终使用 std::move,您可以将 jsonCollector 更改为:

void Pusher::jsonCollector(nlohmann::json&& dump){
        queue.push_back(std::move(dump));
    }

嗯,引用是区分 C 和 C++ 的众多特征之一。

在其他语言中,如 python 或 java,当您将对象(不是基本类型)传递给函数并在那里更改它时,它也会在调用方实体中更改。在这些语言中,你没有指针,但你需要传递对象,而不是副本。

这就是 C++ 中的引用。它们像值类型一样使用,但它们不是副本。 指针可以是 nullptr(或 C 中的 NULL),引用不能。指针指向的地址可以改变(赋值),不能改变引用指向的对象。

查看此 https://en.cppreference.com/w/cpp/language/reference 了解更多信息。