2017-10-19 3 views
1

doSomethingという別のコードで作業していますが、これは2つのテンプレート:stageおよびTによって異なります。 は、私は、彼らはちょうど私が今BaseOneBaseTwoDerivedOneDerivedTwoをキャストする必要がある状態(MicroDerivedOne)または(MacroDerivedTwodoSomethingテンプレートの非コール・キャスト機能でコンパイル・エラーが発生しました

を取ることができることを知っています。コードに見られるように、コンバージョンは、ステージが正しいときに行われる のみです。つまり、常にo.kです。 まだこのキャストは行われていませんが、DerivedOneBaseTwoをキャストできないため、コンパイルエラーが発生します。

質問: 関連するクラスとテンプレートの一般的な構造を変更せずにこのコードをコンパイルするにはどうすればよいですか? (これはコードの他の多くの部分に壊れてしまいます)。 好ましくは私はdoSomethingを変更したいだけです。

キャストがb.c.で発生します。 BaseOneまたはBaseTwoのいずれかを使用できるオーバーロードされた関数を呼び出す必要があります。したがって、DerivedTwoを渡すには、明示的にキャストする必要があります。

aTest.h

enum Stage { 
    Micro, 
    Macro 
}; 

class BaseOne 
{ 
int a; 
}; 

class BaseTwo 
{ 
int b; 
}; 


class DerivedOne : public BaseOne 
{ 
int c; 
}; 

class DerivedTwo: public BaseTwo, public BaseOne 
{ 
int d; 
}; 

template <Stage stage> 
class Doer{ 
    template <class T> 
    void doSomething(T t); 

}; 

aTest.cpp

#include "aTest.h" 

template< Stage stage > 
template < class T > 
void Doer<stage>::doSomething(T t) { 


//depending on stage we need to cast t to BaseOne or BaseTwo 
if(stage == Micro) 
{ 
    overloadedFunction((BaseOne) t); 
} 
if(stage == Macro) 
{ 
    overloadedFunction((BaseTwo) t); 
} 



} 


template class Doer<Micro>; 
template class Doer<Macro>; 


template void Doer<Micro>::doSomething(DerivedOne t); 
template void Doer<Macro>::doSomething(DerivedTwo t); 
+0

キャストは決して作られませんが?この推論によれば、 'if(1 == 0){syntax error; } 'コンパイルする必要があります。キャストを含むコードはインスタンス化されているため、有効である必要があります。私はC++ 11以上のテンプレートには慣れていませんが、おそらくconstexprを助けるかもしれません。 – user463035818

+0

if if constexpr(..) 'C++ 17。 – Jarod42

答えて

1

あなたが使用することができます

if constexpr (stage == Macro) 
    overloadedFunction((BaseTwo) t); 

今、なぜこれが便利になるだろうか?

今if文はconstexprが含まれていることなので、それは条件が真と評価された場合にのみ、でその状態が時間をコンパイルし、評価し、その本体をコンパイルします。これは、体が悪い形になっている可能性があり、それでもコードをコンパイルできることを意味します。続きを読むhere

関連する問題