Ist es möglich, typedef
oder using
zu verwenden, um einen Typ-Alias innerhalb eines Konzepts zu deklarieren, wie von den Concepts TS vorgeschlagen?
Wenn ich etwas wie das folgende MWE versuche, kompiliert der Code nicht (mit gcc 6.2.1 und dem Schalter -fconcepts
)
Ergebnisfehler:
%Vor%Nein. Gemäß den Konzepten TS ist eine Anforderung:
Anforderung :
einfache Anforderung
Typanforderung
Verbindungsanforderung
verschachtelte Anforderung
Wo eine einfache Anforderung ein Ausdruck ist, gefolgt von einer ;
und einer Typanforderung ist etwas wie typename T::inner
. Die anderen beiden klingen wie der Name vermuten lässt.
Ein Typalias ist eine Deklaration, kein Ausdruck und erfüllt somit nicht die Anforderung einer Anforderung.
Das fühlt sich unnötig restriktiv für mich an. Wissen Sie, ob es eine vernünftige Problemumgehung gibt, anstatt den gleichen komplizierten Typ immer und immer wieder zu schreiben?
Sie können die Implementierung der Einschränkungen auf ein anderes Konzept verschieben und diese Typen als Vorlagenparameter übergeben:
%Vor%Wenn Sie dies in Betracht ziehen, schlage ich vor, dass Sie es an einfachen Beispielen versuchen, bevor Sie eine Entscheidung treffen. Wie Sie Ihre Konzepte und Einschränkungen schreiben, bestimmt, wie ein Compiler Fehler meldet und natürlich gute Fehler hat, ist ein großer Teil dessen, was Konzepte nützlich macht. Es ist keine Abwägung, die ich leichtfertig machen würde, wenn ich es einfacher finde, meine Konzepte zu schreiben und schwerere Fehler zu verstehen.
Zum Beispiel habe ich deshalb typename Cont::const_iterator;
als explizite Einschränkung redundant hinzugefügt. Dies gibt dem Compiler die Möglichkeit, diese Typanforderung zu melden. Ich war auch vorsichtig bei der Auswahl von InsertableWith
als Name des Konzepts: Ich hätte einfach mit detail::Insertable
gehen können, aber Fehler, die sowohl Insertable
als auch detail::Insertable
betrafen, könnten dadurch verwirrender geworden sein.
Abschließend sei darauf hingewiesen, dass dies alles auf der Qualität der Implementierung des Compilers beruht, daher erwarte ich nicht, dass ein Ansatz vorläufig definitiv ist. Ich ermutige, mit dieser Coliru-Demo zu spielen.
Tags und Links c++ typedef c++-concepts using-declaration