2016-06-04 18 views
-1

Für verschiedene (C++ 11 std :: string-change-related) Gründe würde ich gerne eine nicht-std :: string verwenden String-Klasse an einigen Stellen in meinem C++ 11-ish-Code, die mit mehreren Versionen von mehreren C++ - Compiler übereinstimmen müssen.Eine portable, std :: string-ähnliche String-Klasse, die nicht std :: string ist

Nun, es macht mir nicht wirklich etwas aus, ob sich meine Strings in C++ 11-style oder post-C++ 11-way verhalten; und ich interessiere mich auch nicht für die Leistung. Ich will nur eine schöne, zuverlässige Zeichenklasse, die mir unter keinen Umständen Fehler gibt, die std::__cxx11::string und andere solche Voodoo betreffen.

Was sind meine Optionen? Kann/sollte ich die Implementierung eines einzelnen Compilers in meinen eigenen Header-Dateien replizieren? Ist GCC vstring eine Option? Etwas anderes?

+0

Was gilt als "string-like"? Sie sagen, Sie interessieren sich nicht für die Unterschiede - ein Teil des Grundes, dass C++ 11 die Änderung vorgenommen hat, ist, dass die neue Version viel threadsicherer ist. Kannst du klarstellen, was du konkret willst? Willst du nur, dass es in beide Arten von Saiten umwandelbar ist? Warum können Sie nicht einfach zwischen den beiden Typen konvertieren, egal welche Grenzen in Ihrem Projekt angemessen sind? Warum brauchen Sie eine dritte Art von String? Warum können Sie nicht einfach alle Code- und verwandten Bibliotheken in C++ 11 mit dem neuen String-Typ neu kompilieren und das ganze Chaos vergessen? –

+0

@ChrisBeck: Nehmen wir an, dass es die Methoden von 'std :: string' implementiert. Oder wenn ich bescheidener sein wollte - kann als ein Kartenschlüssel verwendet werden und hat das Equivalent von '.c_str()'. Fadensicherheit kein Muss. – einpoklum

+0

Ich denke, dass alle Möglichkeiten, die Sie erwähnen, Optionen sind? Die Frage enthält nicht genügend Informationen, um einen dieser Fehler zu beseitigen. Sie könnten sicherlich Ihre eigenen Rollen, die als Kartenschlüssel verwendet werden können und '.c_str()' in 5 Minuten oder weniger haben. –

Antwort

0
template<class T> 
struct crappy_string { 
    mutable std::vector<T> buffer; 
    T const* c_str() const { 
    if (buffer.empty() || buffer.back()) 
     buffer.push_back(0); 
    return buffer.data(); 
    } 
    friend bool operator<(crappy_string const& lhs, crappy_string const& rhs) { 
    lhs.c_str(); rhs.c_str(); // ensure null terminator in both 
    return lhs.buffer < rhs.buffer; 
    }  
}; 

Dies entspricht den minimalen Anforderungen, die Sie in den Kommentaren angegeben haben.

+0

Das würde nur für geordnete Karten funktionieren. Aber Punkt genommen. Ich denke, ich hätte in den Kommentaren nicht auf all diese Methoden verzichten sollen, das war kein gutes Verhandeln :-( – einpoklum