doSomething
という別のコードで作業していますが、これは2つのテンプレート:stage
およびT
によって異なります。 は、私は、彼らはちょうど私が今BaseOne
にBaseTwo
とDerivedOne
にDerivedTwo
をキャストする必要がある状態(Micro
、 DerivedOne
)または(Macro
、DerivedTwo
)doSomething
でテンプレートの非コール・キャスト機能でコンパイル・エラーが発生しました
を取ることができることを知っています。コードに見られるように、コンバージョンは、ステージが正しいときに行われる のみです。つまり、常にo.kです。 まだこのキャストは行われていませんが、DerivedOne
〜BaseTwo
をキャストできないため、コンパイルエラーが発生します。
質問: 関連するクラスとテンプレートの一般的な構造を変更せずにこのコードをコンパイルするにはどうすればよいですか? (これはコードの他の多くの部分に壊れてしまいます)。 好ましくは私は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);
キャストは決して作られませんが?この推論によれば、 'if(1 == 0){syntax error; } 'コンパイルする必要があります。キャストを含むコードはインスタンス化されているため、有効である必要があります。私はC++ 11以上のテンプレートには慣れていませんが、おそらくconstexprを助けるかもしれません。 – user463035818
if if constexpr(..) 'C++ 17。 – Jarod42