static_assert zum Sicherstellen des Konstruktionsvertrags

8

Als Teil eines Entwicklerteams wollte ich sicherstellen, dass eine Reihe von Funktionen (und Operatoren) in den benutzerdefinierten Iteratoren implementiert werden, die wir veröffentlichen. Die Verwendung von STL-Iteratortypen als Basistyp-Hilfe, aber aus irgendwelchen Gründen (außerhalb meiner Kontrolle), entscheiden wir uns, die STL-Kompatibilität nicht zu erzwingen. Die Iteratoren werden von demselben Team und von Mitarbeitern im gesamten Unternehmen genutzt.

Ich wollte eine Vorlagenklasse entwerfen, die den Iteratortyp verwendet und gegen den Designvertrag testet.

Zum Beispiel würde ich erwarten, dass ein Iterator einen Operator ++, operator-- implementiert und auch die erforderlichen typedefs deklariert.

1 & gt; Ist es möglich, eine solche Vorlagenklasse zu implementieren, die den Designvertrag durchsetzt? wahrscheinlich mit static_assert?

2 & gt; Wenn ja, ist das ein gutes Design?

Referenz: benutzerdefinierter Iterator

    
Ram 20.09.2012, 09:42
quelle

2 Antworten

10
  

Ist es möglich, eine solche Vorlagenklasse zu implementieren, die den Designvertrag durchsetzt? wahrscheinlich mit static_assert?

Um zu überprüfen, ob eine bestimmte Methode existiert (sehr ähnlich zu diesem Beispiel ):

%Vor%
  

ist das ein gutes Design?

Ja, weil der Fehler durch das Brechen des Builds sehr schnell aufgefangen wird und der Benutzer der Klasse die Dokumentation nicht lesen muss (die meisten Leute überspringen diesen Teil normalerweise beim Programmieren)

    
BЈовић 20.09.2012, 10:19
quelle
2

Ja, Sie können eine solche Vorlagenklasse implementieren. Sie können SFINAE verwenden, um das Vorhandensein verschiedener Mitglieder zu testen, und wenn sie nicht korrekt sind, static_assert . Obwohl ich nicht sicher bin, warum Sie Typedefs in einer C ++ 11-Welt definieren möchten.

Es ist immer eine gute Idee, zusätzlichen Code zu überprüfen.

    
Puppy 20.09.2012 09:52
quelle

Tags und Links