Ich versuche, ausgefallene Spiele zu spielen, bei denen der C++ - Compiler Hash-Werte von konstanten Strings bei Compiletime synthetisiert. Dadurch könnte ich die Zeichenfolge durch eine einzige Kennung ersetzen, wodurch sich die Codegröße und Komplexität erheblich verringert.Ist ein Compiletime-Konstanten-Index in ein Compiletime-Konstanten-Array selbst Compiletime-Konstante?
Für Programmierung Klarheit und Leichtigkeit, es wäre genial, wenn ich Compiletime mit einfachen Inline-Zeichenfolgen wie "Hallo", die Compiletime konstante Zeiger auf Compiletime Konstante Zeichen sind untersuchen und berechnen.
Wenn ich in diese bei compiletime indizieren kann, kann ich ein Template-Metaprogramm machen, um zu tun, was ich will. Es ist jedoch unklar, ob der C++ - Standard einen ct-konstanten Index eines ct-Konstanten-Arrays selbst als ct-Konstante behandelt.
eine andere Art und Weise, ist
gestellteconst char v="Hello"[0];
ganz gültig C++ (und C). Aber ist der Wert v eine Kompilierzeitkonstante?
Ich glaube schon, die Antwort ist nein, aber in der Praxis akzeptieren einige Compiler es ohne jede Warnung, viel weniger Fehler. Zum Beispiel können die folgenden kompiliert und ausgeführt, ohne auch nur eine einzige Warnung von Intel C++ Compiler:
#include <iostream>
const char value="Hello"[0];
template<char c> void printMe()
{
std::cout << "Template Val=" << c << std::endl;
}
int main()
{
const char v='H';
printMe<'H'>();
printMe<v>();
printMe<value>(); // The tricky and interesting case!
}
jedoch Microsofts Compiler überhaupt nicht kompilieren, eine einigermaßen zusammenhängende Fehlermeldung über die Verwendung einer Vorlage mit einem Objekt mit internen geben Verknüpfung.
Ich vermute die Antwort auf meine Frage ist "Nein, Sie können keine Array-Referenz selbst auf ein konstantes Array mit einem konstanten Index ist konstant bei Compiletime annehmen". Bedeutet das, dass die erfolgreiche Ausführung des Intel-Compilers ein Fehler im Intel-Compiler ist?
Clever Makro Hack den stringize Makro Operator verwenden rohe Zeichen Charize! Natürlich hilft das nicht viel, wenn man versucht, ein Template-Argument zu verwenden. Es sei denn, vielleicht könnte ein varargs style Makro (C99 ??) ein char entfernen, einen neuen typedef erstellen und die verbleibenden var args als rekursiven Typ a-la Loki? – SPWorley