Ich arbeite mit anderen Personen Code, der eine Funktion doSomething
verwendet, die auf zwei Vorlagen ab: stage
und T
. Ich weiß, dass sie die Zustände nur in Anspruch nehmen (Micro
, DerivedOne
) oder (Macro
, DerivedTwo
)Compile Fehler bei Vorlage nicht abgerufene Umsetzungsfunktion
In doSomething
Ich brauche jetzt DerivedTwo
-BaseTwo
und DerivedOne
-BaseOne
zu werfen. Wie in dem Code zu sehen ist, werden die Umwandlungen nur durchgeführt, wenn die Stufe richtig ist, d. H. Sie sind immer o.k. Noch bekomme ich Kompilierungsfehler, weil es nicht möglich ist DerivedOne
zu BaseTwo
zu casten, obwohl diese Besetzung nie gemacht wird.
Frage: Wie kann ich diesen Code kompilieren, ohne die allgemeine Struktur der beteiligten Klassen und Vorlagen zu ändern? (Dies würde zu vielen anderen Teilen des Codes führen). Vorzugsweise möchte ich nur doSomething
ändern.
Die Besetzung erfolgt b.c. Ich muss eine überladene Funktion aufrufen, die entweder BaseOne
oder BaseTwo
übernehmen kann. Um also DerivedTwo
zu übergeben, muss ich es explizit umwandeln.
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);
obwohl die Besetzung nie gemacht wird? Nach dieser Überlegung gilt auch: if (1 == 0) {Syntaxfehler; } 'sollte kompilieren. Der Code, der den Cast enthält, wird instanziiert und muss daher gültig sein. Ich spreche nicht fließend über C++ 11 und darüber hinaus Template-Zeug, aber vielleicht kann ein constexpr helfen, – user463035818
'wenn conexpr (..)' in C++ 17. – Jarod42