2017-10-19 3 views
1

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); 
+0

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

+0

'wenn conexpr (..)' in C++ 17. – Jarod42

Antwort

1

Sie verwenden:

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

Nun, warum wird dies nützlich sein?

Weil nun, dass die if-Anweisung enthält constexpr, wird es seinen Zustand bei bewerten Zeit, kompilieren und wird seinen Körper kompilieren, nur wenn die Bedingung true ergibt. Das bedeutet, dass der Körper schlecht geformt sein kann und trotzdem den Code kompilieren kann. Lesen Sie mehr here.