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);
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.