Da wir Zeichenfolgen nicht direkt in Switch-Case-Anweisungen verwenden können, da sie keine Konstanten auswerten können, habe ich meine Einträge in map<string,int>
gemappt.Verwenden von Map <string,int> Verwenden von Zeichenfolgen in Switch-Case-Anweisungen
map<string,int> hash;
hash["+x"] = 0;
hash["-x"] = 1;
hash["+y"] = 2;
hash["-y"] = 3;
hash["+z"] = 4;
hash["-z"] = 5;
Nun, ich bin mit ihnen in der switch-case-Ausdruck:
cin >> bend //assume user entered +x
switch(hash[bend])
{
case hash["+y"] :
switch(pointedto)
{
case hash["+x"]: pointedto = hash["+y"];
break;
case hash["-x"]: pointedto = hash["-y"];
break;
case hash["+y"]: pointedto = hash["-x"];
break;
case hash["-y"]: pointedto = hash["+x"];
break;
case hash["+z"]: pointedto = hash["+z"];
break;
case hash["-z"]: pointedto = hash["-z"];
break;
}
}
Ich bin immer Fehler: an array reference cannot appear in a constant-expression
für die alle case
s. Ich erwartete hash["+x"]
und andere, int
zurückzukehren, was zu einer Konstante führen wird.
PS: die andere Alternative ist constexpr
von C++11
, aber ich war neugierig, dieses zu verwenden.
Ein konstanter Ausdruck ist etwas, das zur Kompilierzeit ausgewertet werden kann. 'std :: map :: operator []' ist keines dieser Dinge. – DeiDei
_Ich erwartete Hash ["+ x"] und andere, um int * zurückzugeben, was zu einer Konstante führt. * _ Was Sie erwarten, hat ["etwas"] wird zu einer Konstanten führen = –
Es ist * möglich Erstellen Sie eine Map, die durch Strings indiziert werden kann, die einen konstanten Ausdruck ergeben. Die Erstellung erfordert ein wenig Aufwand. Meine [CppCon 2016] (https://cppcon.org/2016program/) zeigte, wie man eine Basisversion erstellt. Das [Video] (https://channel9.msdn.com/Events/CPP/CppCon-2016/CppCon-2016-Dietmar-Khl-Constant-Fun) ist aus meiner Entwickler-Story verlinkt. –