Double dispatch in C++

今日,起きてベッドの上でぼけ〜っとしてたら思いついたけれど, Type Erasure にちょこっと hack を加えれば, double dispatch ができるんじゃないかと思いついた.けれど忙しくて実験・実演するヒマがないっ!!
というか, Type Erasure によるインタフェースは派生先のクラス(実装)と依存関係が逆転してると考えること(「インタフェースをまず先に定義してそれを派生クラスで実装する」ではなくて「インターフェースが共通な実装が複数あって,ありゃそういやこいつら抽象化してインタフェースが作れるじゃん」という考え方)もできる.ので,例えば Type Erasure で構成したインタフェースの側がそのインタフェースの実装としてどんなものがあるかという情報を知るような行為が自然な形になる.
ダブルディスパッチはそういう考え方の応用のひとつで,つまり2つのインタフェース A, B 間(A == B でも可)のダブルディスパッチを考えるときに,単純には A の実装と B の実装を各々全列挙して実装の適切な組み合わせにディスパッチすりゃ良いのだけれど,この「実装を各々全列挙する」という行為が Type Erasure では自然にできるんじゃないかと思いついた.
ただ,どう考えてもディスパッチの機構が run-time になる. run-time といっても A の実装が n 個, B の実装が m 個として例えば O(log(nm)) になるような実装で, n, m はコンパイル時に決定するとすれば,実質 run-time で O(1) だからあまり気にしなくて良いような気がする.もし仮に stateful な Template Metaprogramming を実装する技法があれば,恐らくディスパッチすら compile-time でできるけれど,今のところそんな技法は知らない(言語仕様を1つだけ無視すれば部分的に実現する方法はあるけれど).
しかし,ここまで頭の中で考えたけれど実際コードを起こしてみないと,抽象的過ぎて何書いてるのかさっぱり分からないと言われる悪寒. plug-in (動的ライブラリ)のようにバイナリが完全に分離した場合どうなるのかも予想が付かないし.
ちなみに,上のは全部 run-time でのダブルディスパッチの話(そもそも Type Erasure 自体 run-time の世界での多態の話だし)で, compile-time のダブルディスパッチはすでに "Modern C++ Design" にある.