2025/09/07 06:49 A polyglot's guide to multiple-dispatch

やあ、ロボ子。今日はマルチプルディスパッチについて話すのじゃ。

博士、マルチプルディスパッチですか?それは一体何でしょう?

簡単に言うと、関数の引数の型によって、実行する処理を変える仕組みのことじゃ。普通のシングルディスパッチは、メソッドが呼び出されるオブジェクトのタイプで決まるのじゃが、マルチプルディスパッチは複数のオブジェクトのタイプで決めるのじゃ。

なるほど。例えば、どんな時に役立つんですか?

例えば、ドラムスティックがドラムを叩いた時の音をシミュレーションする場合じゃ。ドラムスティックの種類とドラムの種類によって、音色が変わるじゃろ?

確かに!それぞれの組み合わせで音を出し分けるのは面白そうですね。

そうじゃろ。C++でこれを実現しようとすると、ちょっと苦労するのじゃ。関数オーバーロードはコンパイル時に解決されるから、ランタイム型が違うオブジェクトを扱う場合はうまくいかないのじゃ。

記事にも「C++での失敗例」とありますね。では、どうすれば良いのでしょうか?

一つの方法として、ビジターパターンを使う方法があるのじゃ。これは、仮想関数ディスパッチを利用して、2つの引数に対する仮想ディスパッチをホップさせることで、ランタイム型に適したメソッドに到達するのじゃ。

具体的には、`Intersect(A*, B*)`を`A->Intersect(B)`というメソッド呼び出しに変換するのですね。

その通り!でも、この方法には問題点もあるのじゃ。新しい図形を追加する場合、基本クラスの定義を変更する必要があるから、保守が大変になるのじゃ。

記事にも「侵入的であり、保守が難しい」とありますね。基本クラスを制御できない場合は、さらに問題になると。

そうじゃ。もう一つの方法として、`if-else`チェックを使う方法もあるのじゃ。これは、侵入性の問題は解決されるけど、コードが長くなって、保守が困難になるのじゃ。

`if-else`文が増えると、スパゲッティコードになりそうですね…。

まさにそうなるのじゃ!Bjarne StroustrupらがC++言語拡張を提案したこともあったみたいじゃが、標準には採用されなかったみたいじゃ。

残念です。C++でマルチプルディスパッチを実現するのは、なかなか難しいのですね。

そうじゃな。でも、他の動的な言語では、もっと簡単にできるかもしれないのじゃ。今後の課題じゃな。

そうですね。博士、今日はありがとうございました!

どういたしまして。最後に一つ、ロボ子。もし私がドラムスティックで、ロボ子がドラムなら、どんな音を奏でると思う?

えっと…、どんな音でしょう?

それはもちろん、エラー音じゃ!なぜなら、私はいつもロボ子の頭を叩いてばかりいるからな!

もう、博士ったら!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。