我正在編寫一個使用Boost.Asio的C++ 11網絡庫。我想公開一個允許用戶使用堆棧協程的API。我應該如何接受我的API函數中的boost::asio::yield_context
參數?按價值?引用?通過const引用?我不知道這些yield_context
對象要複製的代價有多昂貴。我應該如何在自己的函數中傳遞boost :: asio :: yield_context?
例如:
Result remoteProcedureCall(Args args, boost::asio::yieldcontext yield)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ How to pass?
我知道,我可以採取一個普遍的參考和做完美轉發:
template <typename TYield>
Result remoteProcedureCall(Args args, TYield&& yield)
{
//...
boost::asio::async_write(socket_, buffer, std::forward<TYield>(yield));
//...
}
但我寧願我的API的功能是不模板,使我可能會實施Pimpl成語。
爲'const&'和'&&'重載它,因此您可以從臨時對象中移出,並同時複製對象,並且仍然保證不會發生任何更改。不知道這是否違反了Pimpl成語壽(我對Pimpl沒有真正的經驗) – Creris
不,它不應該違反Pimpl,只要它不涉及模板成員函數。 –
經過進一步的挖掘,'yield'參數將不可能作爲臨時的傳遞。 'basic_yield_context'構造函數文檔說:*大多數應用程序不需要使用這個構造函數。相反,spawn()函數將yield上下文作爲參數傳遞給協程函數。* –