だが、私は次のテンプレートを持っていると言う取得する機能の連鎖を探す必要な出力
template<>
B my_cast<B, A>(const A& a) { /* stuff */ }
template<>
X my_cast<X, A>(const A& a) { /* stuff */ }
template<>
C my_cast<C, B>(const B& b) { /* stuff */ }
template<>
C my_cast<C, X>(const X& x) { /* stuff */ }
template<>
V my_cast<V, A>(const A& a) { /* stuff */ }
template<>
Z my_cast<Z, V>(const V& v) { /* stuff */ }
私はZ
へA
からキャストしたい場合は、私はそのような2つのキャストを組み合わせなければならないでしょう:auto z = my_cast<Z>(my_cast<V>(some_a))
;
これは明らかに例です。私はこのような数十回のキャストを経なければならない場合を想像しています。これを手動でコーディングすることは明らかに不可能です。 my_cast<Z>(some_a)
が自動的に解決されるように、コンパイル時にこれらのパスを自動的に見つける方法はありますか?
これは、悲しいことに、A
からC
へのキャストのようないくつかのあいまいさをもたらす可能性があります。これは、A→B→C、またはA→X→Cの2通りあります。この場合、コンパイルエラーは満足のいくものです。
あなたのために十分な構文があれば、あなたのキャストをメンバ関数として定義することができます: 'some_type my_cast(std :: integral_constant){...}'、 'i'は増分IDです。パラメータとしてtagを使用すると、SFINAEを使用して型からすべての可能なキャストを数え、コンパイル時に反復処理できます。その後、必要なタイプを探しているキャストのグラフを再帰的にトラバースすることができます。私はそれを試してみるつもりですし、後で答えを出すかもしれません。 –
HolyBlackCat