最後の引数boost :: asio :: yield_contextをとる非同期関数を作成したいと思います。例えば:error_codeをasio :: yield_contextに設定するには
int async_meaning_of_life(asio::yield_context yield);
私はまた、ASIOはエラーコードを返す方法と矛盾しないようにしたいと思います。ユーザーがない場合はそれは、次のとおりです。
int result = async_meaning_of_life(yield);
と機能に障害が発生し、それはsystem_error
例外がスローされます。しかし、ユーザーがない場合:
boost::error_code ec;
int result = async_meaning_of_life(yield[ec]);
その後 - 代わりに投げるの - エラーがec
で返されます。
問題は、関数を実装するときに、演算子[]が使用されているかどうかをチェックし、そうであればそれを設定する明確な方法が見つからないようです。私たちはこのような何かを思い付いた:
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(ドキュメントだけではあるが)であるので、それは、ハックです。
私がこれを行うと考えることのできるもう1つの方法は、yield
オブジェクトをasio::handler_type
に変換して実行することです。しかし、この解決法は最高の状態では厄介なようです。
別の方法がありますか?
ありがとうございますが、これは「yield」オブジェクトを「asio :: handler」に変換したものです。質問。私はハンドラ、先物、コルーチンをサポートする汎用の非同期関数を作成しようとしていません。正反対ですが、コードの明快さのために可能な限り長い間、コルーチンを使用しようとしています。 –
あなたの恐怖の確認としてこの答えを考えてみましょうか?あなたがしたいことは、誰かが新しい情報を得るまで(あるいはライブラリAPIが拡張されるまで)厄介な気持ちになることです。 – sehe
遅れて申し訳ありません。私はあなたの答えを変更して、最初はどこかに明示的に言及することができないと思っています。誰かが間違っていることを証明するまでは、答えとしてマークするのが喜ばしいでしょう。 –