LocalTypeHashというかKeyにかぶりがあってもコンパイルを通す型mapの種

受け取ったタイプリストに対し適当な数字を被らないように返すLocalTypeHashメタ関数を作りたい

using TypeHash=makeTypeHash<List<char,int void>>;

TypeHash::apply<char>//0
TypeHash::apply<int>//1
TypeHash::apply<void>//2

こんな感じ

しかして型が被った場合どうなるだろう

この場合このままだと環境によって違う動きをすることになるだろう。未定義動作である
あるコンパイラは不明瞭だと言い動かないし、あるコンパイラは小さいほうの数値を返すし、あるコンパイラは大きい数値を返すであろう。くそぅくそぅ

……という内容の記事を今年の5月ごろ書いた
規格的にヤバそうな限定type_hashメタ関数を作ったけどGCCで動かないし、別の実装とかも考えたけどそれもダメくさいしもうだめだ - TXT.TXT

この問題を解決するのにuniqueを使っている
しかしuniqueという動作は結構重い。そこでuniqueを使わない方法を考えてみた

local_type_hash

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

検索時まず一番最初のAの中から探す
テンプレート関数とオーバーロード関数があるがオーバーロードのほうが呼び出し優先順位が高いのでまずオーバーロード関数の中からマッチする関数の検索が始まる
もしもAの中でかぶりがある場合より継承が低いレイヤー、つまりリストの左の方が優先される
オーバーロードの中でマッチする関数が見つからない場合、呼び出し優先度が低いテンプレート関数が呼び出され次のAに移る
以降繰り返し

この方法だと再起深度はO(√N)に抑えられるだろう。1024でも32*Kなので大丈夫(たぶん)