私はC ++の初心者です(Cから来ました)。RAII がどのように機能するかは概念的に理解していますが、単純なソケット接続ハンドラを RAII に適合させるのに苦労しています。
現在のコード:
void accept_ev(event_handler::token &t, int listenfd)
{
int newfd = accept(listenfd, NULL, NULL);
if (newfd < 0)
throw api_server_accept_failed(*this, errno);
connections.insert(api_server_connection(newfd));
}
api_server_connection コンストラクターは fd をそのメンバー変数に割り当てる前に例外を発生させる可能性があるため、これは明らかに安全ではありません。
そこで私の次の考えは、accept をコンストラクターに移動することでした。問題は、fd がどこから来たのかについて api_server_connection を知りたくないということです。たとえば、将来 inetd をサポートしたい場合は、fd 0 としてプログラムに渡すこともできます。
では、どうすればよいのでしょうか。fd を取得する方法ごとに異なるコンストラクターを使用する必要がありますか? おそらくサブクラスを作成する必要がありますか?別のオプションは、ラムダ関数を持つことでしょうか?
または、その場合、エラーをキャッチして呼び出し元の fd を閉じる必要がありますか?