パスワードを忘れた? アカウント作成
499880 journal

okuの日記: 生粋の (じゃないけど) C++ 使いの人からの視点

日記 by oku

オブジェクト指向の言語比較論Chain of Responsibility の実装の比較 C++ による実装 より:

いろいろ見てきたけど、生粋の C++ 使いの人には不満を感じるところもあるかもしれない。「問題、問題っていうけど、そもそも動的なリクエストのハンドラの追加って意味あるの?」とか。まぁ、ちょっと待って。ここでの目的は、Chain of Responsibility の実装の議論ではなく、これを題材にした各言語の比較なので。他の言語での実装と見比べて、C++ の特徴を感じてください。

不満を感じるかと言われれば、多分そうだろうと思います。 問題を動的に扱わざるを得なくなった時点でなんだか敗北感満載な感じがしますから (自分だけかも知れません)。 動的といっても virtual は別に気になりません。 RTTI 的なものに手を出すと何となく負けた感がするという意味です。 まあ、現実の世界ではクラスライブラリとかフレームワークとかが支援してくれる例が多かろうとは思いますが。

クラスライブラリとかフレームワークとかを使わずにこの例題を何とか、と言われると... う~ん、POSIX 依存してしまいますが、私だったら最初の「リクエストを数値で指定する」の変形版として「リクエストを文字列で指定し、 dlopen でリクエストに応答する関数がロードできたら this を渡して何とかかんとか」という辺りにしてしまうのではないかと思います。 元の例の Handler クラスにはリクエスト可能な文字列の vector を持たせておいて、派生クラスのコンストラクタでは自分が対応できるリクエスト可能文字列を追加、実行時に enable / disable したければ、そこからリクエスト可能文字列を足し引きするという感じでいかがでしょうか。

とは言え、 dlsym の結果を関数ポインタにするのに reinterpret_cast が要りますし、ロードした関数の中で dynamic_cast が必要になりそうですから、あちこちから叩かれそうなコード例になりそうですね。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...