我想創建一個異步函數,它將最後一個參數boost :: asio :: yield_context作爲參數。例如: -如何將error_code設置爲asio :: yield_context
int async_meaning_of_life(asio::yield_context yield);
我也想與短耳如何返回錯誤代碼是一致的。也就是說,如果用戶確實:
int result = async_meaning_of_life(yield);
和函數調用失敗,則拋出system_error
例外。但是,如果用戶確實:
boost::error_code ec;
int result = async_meaning_of_life(yield[ec]);
然後 - 而不是拋出 - 在ec
返回錯誤。
問題是,當實現該功能時,我似乎無法找到一個乾淨的方法來檢查是否使用了operator [],並且如果是這樣的話就設置它。我們想出了這樣的事情:
inline void set_error(asio::yield_context yield, sys::error_code ec)
{
if (!yield.ec_) throw system_error(ec);
*(yield.ec_) = ec;
}
但是,這是哈克,因爲yield_context::ec_
是declared private(雖然只在文檔中)。
我能想到的另一種方法是將yield
對象轉換爲asio::handler_type
並執行它。但是這個解決方案看起來好像很尷尬。
還有別的辦法嗎?
謝謝@sehe,但這是「將yield對象轉換爲'asio :: handler'」解決方案,我在這個問題。我沒有試圖創建一個支持處理程序,期貨和協同程序的通用異步函數。恰恰相反,爲了代碼清晰,我試圖儘可能長時間地使用協程。 –
想想這個答案是爲了確認你的恐懼嗎?你希望做的事情會一直呆在尷尬的地方,直到有人出現新的信息(或者API庫被擴展)。 – sehe
抱歉,延遲。我認爲如果你修改你的答案,明確提到某個地方在目前是不可能的,我會很樂意將它標記爲答案,直到有人證明我們錯了。 –