yet another typeof

Arkadiy Vertleyb氏のtypeofエミュレーションの実装は,効率(コンパイル速度)と規模耐性(どこまで複雑な型を扱えるか)がいまいち気に食わない.氏の実装(というか普通に考えられるtypeofエミュレーションの実装)は,型の解析に型の複雑さの2乗オーダーかかるはずだし,規模耐性の観点からは型の情報を同時一斉にテンプレートに展開するので扱える型の複雑さがそのまんまテンプレート引数の数になる.
自分も最初似たような実装をして解析させてみたら,1つのオブジェクトのtypeofをコンパイルするのに3分もかかるという前代未聞の実装が出来たw.解析させたオブジェクトの型がcharの後ろにポインタが119個続くヤツ(以下これをコードネーム"char*119"と呼称する)だったというのもあれだけれどw.
なので実装を書き換えた.ある程度は氏の実装からアイデアを借りたけれど,心臓部の型の解析の実装をまったく新しいアイデアを使って根本的に書き変えた.ほとんど勢いだけでフルスクラッチから書いた気分・・・っていうか実装読んでアイデアだけ抽出してコピペとか一切してないからフルスクラッチって言って良いのかな.
で,前と同じこと("char*119"の解析)したら一瞬(数秒)でコンパイルが終了した.こんときばかりはさすがにリアルで「キタ━━━━(Д゜(○=(゜∀゜)=○)Д゜)━━━━━!!!!」をやってしまった.
以上はVC++7.1でのことで,この実装を他のplatformでコンパイルしようとしてみた.一応標準C++とBoostの範囲内で書いたコードなので,他で通れば超(゜д゜)ウマーなはずだった.でもやっぱりGCCでのコンパイルがたった1箇所のデバッグだけで通ったことには一番驚いた.Boost万歳.ただ,さっきと同じ"char*119"をコンパイルするのにGCCだと10分かかった.これはコンパイラが関数のオーバーロードをどう保持しているかの違いによるもので,予測の範囲内だったのでそんなには驚かなかったけれど.ICC 7.1があったのでそれでもコンパイルしてみようとしたけれど,テンプレートの再帰インスタンス化に弱いらしくはじかれた.(´・ω・`)ショボーン
結論:VC++7.1限定で効率と規模耐性が(゜д゜)ウマーなtypeofが出来た.(VC++7.0以前やその他のコンパイラだとどうなるのかは現物持ってないので(゜⊿゜)シラネ)
ま,GCCにはnativeの__typeof__があるからそれと切り分ければ一応VC++7.1とGCCで使えるtypeofが出来たことにはなるか.
ちなみに,コードネーム"char*199"や"pair7"(std::pairを7回ネストさせた型)などのさらに複雑な型のtypeofをコンパイルさせようとすると,コンパイラが一瞬でメモリ1Gを食い尽くした上にさらに大量のスワップが発生してた.けれどそれは見なかったことにした.
おわり.