Es gibt zwei weit verbreitete Implementierungen von statischen Asserts für Versionen von C ++, die nicht über static_assert
verfügen.
Der erste wird in Boost verwendet und verwendet eine Vorlage und eine Spezialisierung dieser Vorlage :
%Vor%Wenn die zu prüfende Bedingung einmal falsch ist, kann der Compiler keine generische Version der Vorlage finden und die Kompilierung schlägt fehl.
Die zweite verwendet typedef
:
Hier wird, sobald eine zu überprüfende Bedingung verletzt ist, der Compiler versucht, typedef
auf ein Array der Größe -1 zu setzen, und das ist daher ein Fehler bei der Kompilierung.
Letzteres ist für mich besser, da es garantiert keinen Code aussendet und auch so verwendet werden kann (aus hier ):
%Vor%während ersteres nicht so verwendet werden kann.
Gibt es einen Grund, die frühere Implementierung von statischem Assert gegenüber letzterem vorzuziehen?
Ich habe die zweite oder eine Variante davon in meinem eigenen Code verwendet. In der Praxis hat die Boost-Variante den Vorteil, dass sie verwendet werden kann überall kann ein Ausdruck erscheinen, und nicht nur auf Anweisungsebene. Es hat den Nachteil, dass es nur dort verwendet werden kann, wo eine Expression möglich ist erscheinen und somit nicht im Namensraumbereich.
Zweite Version von STATIC_ASSERT
, die Sie nicht nacheinander im selben Block verwenden können.
Demo .
Andererseits können Sie in dem von Ihnen geposteten Beispiel die erste Version nicht verwenden (weil es sich um temporäre Konstruktionen handelt). Also hat die Version ihre eigene Zielgruppe. 1. Version kann ich sagen ist eine Art Mischung aus Kompilieren und Laufzeit. Die zweite Version ist jedoch reine Kompilierzeit.
Bearbeiten : Manchmal möchten Sie zur besseren Lesbarkeit alle Argumente in eine Zeile mit einem comman-Operator setzen (wobei in diesem Fall nur die letzte Anweisung wirksam ist). Ich weiß, dass sie auch mit ;
angegeben werden können. Aber nur um ein Beispiel zu haben, ist dies ein Anwendungsfall.
Ähnlich wird es Situationen geben, in denen die Objektkonstruktion in Ordnung sein wird, aber ein typedef
zu setzen, wird syntaktisch nicht in Ordnung sein. So werden alle diese an den gleichen Ort fallen.
Tags und Links c++ visual-c++ templates static-assert