So habe ich eine schöne hartnäckige Allokator-Klasse , die ermöglicht mir C++ Container-Objekte und Zeichenfolgen im persistenten Speicher, die von einer Mmap-Datei unterstützt wird, die von einem Lauf von meinem Programm auf die beibehalten werden kann Nächster.Kopieren von Objekten mit verschiedenen Zuweisern in C++
Mein Problem kommt, wenn ich etwas tun möchte, das persistente und nicht persistente Objekte mischt. Zum Beispiel habe ich
typedef std::basic_string<char, std::char_traits<char>, persistent_alloc<char>> pstring;
pstring a, b, c;
std::string x, y, z;
Ich will die Dinge zu tun, wie in der Lage sein:
if (a == x)
a = y;
c = z + b;
und so weiter, aber standardmäßig ist es nicht funktioniert, wie pstring
und std::string
nicht verwandten Arten sind. Nun, was den Vergleich betrifft, kann ich definieren:
template<typename Alloc1, typename Alloc2> inline bool
operator==(const std::basic_string<char, std::char_traits<char>, Alloc1> &a,
const std::basic_string<char, std::char_traits<char>, Alloc2> &b)
{
return strcmp(a.c_str(), b.c_str()) == 0;
}
... und jetzt kann ich Zeichenfolgen für die Gleichheit vergleichen. Aber diese für jede Operation hinzuzufügen scheint wie ein Schmerz - es scheint, als ob sie von der Standardbibliothek bereitgestellt werden sollten. Schlimmer noch, Zuweisungsoperatoren und Kopierkonstruktoren müssen Mitglieder sein und können nicht als globale Inline-Funktionen wie diese definiert werden.
Gibt es einen vernünftigen Weg, dies zu tun? Oder muss ich die gesamte Standardbibliothek neu schreiben, um Zuweiser sinnvoll zu unterstützen?
Dies wurde in der Vergangenheit zum Standardausschuss gebracht. Diese Beschränkung des aktuellen Zuweisungsmodells und andere werden in [n1850] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1850.pdf) gezeigt. Das Zuweisungsmodell in C++ ist nicht sehr gut definiert, und es ist tatsächlich problematisch (die Alternative in n1850 ist auch aus verschiedenen Gründen problematisch) –
Nicht zusammenhängende Anmerkung: Denken Sie daran, dass Ihr Programm UB wäre, wenn die Typen "std :: is_trivialy_copyable" erfüllen :: value == true', es sei denn, Sie stellen den persistenten Speicher an genau der gleichen absoluten Stelle oder etwas Ähnlichem wieder her. –
Sie möchten, dass sich einige Operationen gleich verhalten und einige Operationen sich anders verhalten. Wie würde der Compiler wissen, wenn du es nicht buchstabierst? –