2015-01-15 18 views
4

我正在編寫一個使用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成語。

+1

爲'const&'和'&&'重載它,因此您可以從臨時對象中移出,並同時複製對象,並且仍然保證不會發生任何更改。不知道這是否違反了Pimpl成語壽(我對Pimpl沒有真正的經驗) – Creris

+0

不,它不應該違反Pimpl,只要它不涉及模板成員函數。 –

+0

經過進一步的挖掘,'yield'參數將不可能作爲臨時的傳遞。 'basic_yield_context'構造函數文檔說:*大多數應用程序不需要使用這個構造函數。相反,spawn()函數將yield上下文作爲參數傳遞給協程函數。* –

回答

5

上下文的生命週期與協程本身的生命週期相對應,這是很有意義的。

這意味着,我預計它包含實際(隱藏)實現狀態的指針(或reference_wrapper)。

這就是說,簡單地按照Boost庫本身的做法,即按照價值取yield_context對象。

+1

我查看了'basic_yield_context'頭文件,該對象包含'weak_ptr',兩個引用和一個指針。複製並不是很昂貴。 –

相關問題