Was möchten Sie wahrscheinlich wie ein compile-time if etwas ist. Leider hat C++ 11 keine native Unterstützung für ein solches Sprachkonstrukt.
Wenn Sie jedoch nur, ob zwei Arten identisch sind möchten zu überprüfen, die std::is_same<>
Typ Merkmal sollte Ihnen helfen:
#include <type_traits> // <== INCLUDE THIS STANDARD HEADER
// class template:
template <class T>
class mycontainer
{
T element;
public:
mycontainer (T arg) {element=arg;}
T increase()
{
if (std::is_same<T, int>::value) // <== THIS IS HOW YOU WOULD USE IT
return ++element;
if (std::is_same<T, char>::value) // <== THIS IS HOW YOU WOULD USE IT
{
if ((element>='a') && (element<='z'))
element+='A'-'a';
}
return element;
}
};
im Auge behalten jedoch, dass die Bedingungzur Laufzeit ausgewertet wird, obwohl der Wert is_same<T, int>::value
zur Kompilierzeit bekannt ist. Das bedeutet, dass sowohl der true
als auch der false
Zweig der if
Anweisung kompilieren müssen!
Zum Beispiel würde die folgende nicht legal sein:
if (std::is_same<T, int>::value)
{
cout << element;
}
else if (std::is_same<T, my_class>::value)
{
element->print(); // Would not compile when T is int!
}
Auch als Xeo richtig in den Kommentaren darauf hingewiesen, wird der Compiler wahrscheinlich Warnungen ausgeben, weil Ihr Zustand immer zu true
evaluieren oder zu false
, einer der beiden Zweige enthält also nicht erreichbaren Code.
Wenn es nur ein 'static_if' ... vielleicht wird dies auf die gleiche Sache lösen – David
Es wurden viele Vorschläge für eine' static_if' gewesen, aber alle hatten Probleme. SG8 schrieb kürzlich [eine Analyse der Vorschläge] (https://docs.google.com/viewer?a=v&pid=forums&srcid=MDIyMDc3NjUwMTczOTM0Mjk3NjABMDI2MzM3MjkxNDM4NDQ5MzE4NDcBLWVsS1Y4dFhtdDhKATUBaXNvY3BwLm9yZwF2Mg & authuser=0). –
@JosephMansfield Der von Ihnen angegebene Link hat keine Vorschau. – kevin