Gibt es eine Möglichkeit, Zeichenfolgen zu implementieren, um sowohl zur Kompilierungszeit als auch zur Laufzeit zu arbeiten?C++ 11 conetexpr Zeichenfolgenimplementierung
AFAIK für eine Klasse, die consExpr konstruiert werden soll, muss sie einen trivialen Destruktor haben. Dies erweist sich jedoch als schwierig, wenn es sich um Strings handelt. Wenn die Zeichenfolge NICHT conexpr ist, muss sie Speicher freigeben. Wenn es jedoch consExpr ist, dann wird es statisch zugewiesen und sollte nicht gelöscht werden, was einen trivialen Destruktor erlaubt.
Es ist jedoch nicht möglich zu sagen "Hey, Compiler! Wenn ich Constexpr bin, müssen Sie mich nicht zerstören!" Oder ist es?
Es wäre so etwas wie die folgenden:
class string {
private:
char * str;
public:
template<std::size_t l>
constexpr string(const char (&s)[l]) : str(&(s[0])) {}
string(const char * s) { str = strdup(s); }
static if (object_is_constexpr) {
~string() = default;
}
else {
~string() { free(str); }
}
};
Der nächstgelegene ich habe in der Lage zu kommen, ist für zwei unterschiedliche Arten mit, Schnur und constexpr_string, eine benutzerdefinierte wörtliche _string Rückkehr constexpr_string und ein Benutzer implizite Konvertierung von consExpr_string in String.
Das ist nicht sehr schön, aber const auto s = "asdf"_string;
funktioniert, aber const string s = "asdf"_string;
nicht. Außerdem wird ein Verweis/Zeiger auf einen consExpr_string nicht konvertiert. Die Vererbung führt in beiden Fällen zu nicht intuitiven "Gotchas" und löst das erste Problem nicht.
Es scheint so, als ob es möglich sein sollte, solange der Compiler dem Programmierer VERTRAUEN sollte, dass der constexpr nicht zerstört werden musste.
Wenn ich ein Missverständnis habe, lass es mich wissen.
Ich denke, Sie suchen nach 'strwrap' von http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/ – Cubbi
String Literals' const char (& Var) [N] '_are_ der Zeichenfolgetyp 'constexpr'. –
Sie müssen lieben, wenn Leute anfangen, Eigenschaften wie 'statisches if' zu verwenden, bevor sie genehmigt werden! –