Gibt es eine Möglichkeit, in C++ „teilweise rekursive“ Funktionseinschränkungen festzulegen?C++

Programme in C++. Entwicklerforum
Guest
 Gibt es eine Möglichkeit, in C++ „teilweise rekursive“ Funktionseinschränkungen festzulegen?

Post by Guest »

Ich schreibe eine Richtlinienklasse, TrivialSerializer, die später in C++ in eine Funktion eingefügt wird. Diese Richtlinie muss Objekte serialisieren, deren Typen bis zu einem gewissen Grad durch andere Richtlinien angegeben werden können, und sie in einen Stream schreiben. Nur der Objektwert muss serialisiert werden, da das Layout und die Struktur der Objekte zuvor festgelegt werden.
Um dies zu erreichen, verwende ich eine generische Vorlage für statische Memberfunktionen static void write(output_stream_t& stream, T const& object), das beliebige Objekte serialisiert, wobei nur bestimmte Spezialisierungen und Überladungen der Vorlage nicht gelöscht werden. Ich habe zum Beispiel eine generische Spezialisierung für Größenbereiche der Form

Code: Select all

template 
requires requires(output_stream_t& stream, ranges::range_value_t value) {
{ write(stream, value) };
}
static void write(output_stream_t& stream, T const& range);
und ich haben ähnliche Spezialisierungen für Tupel und Integrale sowie Überladungen für bestimmte Klassen, die separat behandelt werden sollten.
Das Problem hier ist, dass die Art und Weise Die Einschränkungen werden von der Sprache analysiert und entsprechen nicht der Absicht, die ich beim Schreiben hatte. Ein Typ wie vector versucht nicht, die Spezialisierung für Größenbereiche zu verwenden, da sein Werttyp vector ist, dessen Spezialisierung noch nicht von instanziiert wurde Zeit, in der die require-Klausel ausgewertet wird. Der Typ vector selbst verwendet natürlich die richtige Überladung, wenn er an einer anderen Stelle als in dieser spezifischen require-Klausel verwendet wird. Das beabsichtigte Verhalten beim Aufruf von write(output_stream_t&, vector const&) besteht darin, dass der Typprüfer die Spezialisierung für Größenbereiche berücksichtigt und nach einer Möglichkeit sucht, write(output_stream_t&, vector const& aufzurufen ), was dazu führt, dass die Spezialisierung für Größenbereiche erneut berücksichtigt wird und nach einer Möglichkeit gesucht wird, write(output_stream_t&, int const&) aufzurufen Es findet in Form der Integralspezialisierung statt, was zu dem Schluss führt, dass vector als zweites Argument zum Schreiben von verwendet werden kann.
Meine Hauptfrage lautet: Gibt es eine Möglichkeit, den C++-Einschränkungsprüfer zu veranlassen, diese „rekursive“ Berücksichtigung von Überladungen durchzuführen, oder muss ich auf Laufzeiteinschränkungsprüfungen innerhalb der Funktionskörper von write zurückgreifen? Meine zweite Frage lautet: Gibt es derzeit Vorschläge des Ausschusses und der Arbeitsgruppen, um dieses Problem anzugehen?
Ich habe diese Frage bereits gesehen, auf die ich bald stoßen werde das gleiche Problem habe ich, aber es bietet in diesem Fall keine Lösungen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post