2017-11-30 19 views
2

だが、私は次のテンプレートを持っていると言う取得する機能の連鎖を探す必要な出力

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 */ } 

私はZAからキャストしたい場合は、私はそのような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通りあります。この場合、コンパイルエラーは満足のいくものです。

+0

あなたのために十分な構文があれば、あなたのキャストをメンバ関数として定義することができます: 'some_type my_cast(std :: integral_constant ){...}'、 'i'は増分IDです。パラメータとしてtagを使用すると、SFINAEを使用して型からすべての可能なキャストを数え、コンパイル時に反復処理できます。その後、必要なタイプを探しているキャストのグラフを再帰的にトラバースすることができます。私はそれを試してみるつもりですし、後で答えを出すかもしれません。 – HolyBlackCat

答えて

0

いいえ、これは自動的には実行できません。 1つのレベルの自動変換は許可されていますが、コンパイラは単にそれ以上の処理を行わないだけです。

+0

何かは、あなたがSO住人のテンプレートのカンフースキルを過小評価すると言っています。 :)(それは変換宣言の別の構文を要求するかもしれませんが、それでもなお) – HolyBlackCat

関連する問題