C ++ Konzepte lite und Typ Alias-Deklaration

9

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 )

%Vor%

Ergebnisfehler:

%Vor%     
Slizzered 30.10.2016, 19:54
quelle

2 Antworten

2

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.

    
Barry 01.11.2016, 17:46
quelle
2
  

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.

    
Luc Danton 16.11.2016 00:09
quelle