簡體   English   中英

如何從函數返回 grpc::ClientContext ?

[英]How can I return a grpc::ClientContext from a function?

我試圖通過具有用於創建 ClientContext 的函數來避免重復代碼。 以下代碼編譯:

template<typename T>
grpc::ClientContext&& context_with_deadline(T duration) {
    grpc::ClientContext context;
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
    return std::move(context);
}

如果沒有將返回類型設為右值引用,或者沒有顯式 std::move(我使用的是 C++ 11,所以我相信 RVO 和復制省略號不能保證),它不會編譯。

在其他范圍內,我現在正在嘗試執行此操作,但無法編譯:

grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));

它嘗試創建一個臨時對象並將其復制到stream_context ,這是無法完成的,因為ClientContext的復制構造函數是私有的(未刪除)。

有沒有辦法在不使用unique_ptr情況下做到這一點? 如果沒有,這可以被認為是一個錯誤嗎? (似乎應該刪除復制構造函數,而不是私有的)。

注意:當我說“不編譯”時,這意味着編譯器發出了以下內容:

錯誤:'grpc::ClientContext::ClientContext(const grpc::ClientContext&)' 在此上下文中是私有的

復制構造函數是私有的,並且不存在用戶定義的移動構造函數,因此您嘗試執行的操作是不可能的。 與其從方法中返回一個新實例,不如讓它引用一個實例:

template<typename T>
void context_with_deadline(grpc::ClientContext& context, T duration) {
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
}

然后像這樣調用它:

grpc::ClientContext stream_context;
context_with_deadline(stream_context, std::chrono::milliseconds(3000));

這是不可能的。 在完成以下操作之前,可以使用std::unique_ptr解決該問題:

https://github.com/grpc/grpc/issues/16680

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM