Diese sehr seltsame Anfrage kam ...
Ich muss eine Kompilierzeit überprüfen, ob die aktuelle Funktion einen void
Rückgabetyp hat oder nicht und die Kompilierung fehlschlägt, wenn der Rückgabetyp void
ist.
Ich habe versucht, mit Ссылка und decltype
auch etwas Magie zu machen, aber ich kann es einfach nicht bekommen näher an einer Lösung.
Also hier kommt die Frage:
Ist dies für die aktuelle Funktion möglich?
BEARBEITEN Die Überprüfung des Rückgabetyps sollte in einem Makro erfolgen, da es in mehreren Funktionen verwendet wird.
Sie können die Überprüfung der Kompilierungszeit implementieren, wenn ein Zeichenfolgenliteral mit einer anderen beginnt, und das Makro __PRETTY_FUNCTION__
verwenden, das auf Zeichenfolgenliteral gesetzt ist und mit dem Rückgabetyp function beginnt. Sie sollten überprüfen, ob dieses Makro mit void
gefolgt von Leerzeichen beginnt.
Dieser Code wird gut übersetzt:
%Vor% Wenn Sie f
return type in void
ändern:
static_assert
wird ausgelöst.
Das Makro __PRETTY_FUNCTION__
scheint spezifisch für den GNU C ++ - Compiler zu sein, jedoch funktioniert clang++
gut, da es auch dieses Makro definiert. Wenn Sie einen anderen Compiler verwenden, sollten Sie überprüfen, ob dieses Makro tatsächlich gesetzt ist, und wenn nicht, lesen Sie die Compiler-Dokumentation, um Ähnliches zu ermitteln
Makro, z.B. __FUNCSIG__
.
Sie können mit #ifdef __PRETTY_FUNCTION__ ...
herumspielen, um dies zwischen verschiedenen Compilern tragbarer zu machen, aber ich glaube, das ist ein Thema für eine andere Frage.
Sie können den Rückgabetyp der aktuellen Funktion überprüfen, indem Sie prüfen, ob eine dead return
kompilieren kann:
Der Fall von void
ist ein spezieller, das ist genug. Sie können aber auch andere Arten verbieten, indem Sie ConvertToAnything::operator Type() = delete;
überladen. % Co_de% zuzulassen ist etwas komplizierter, aber immer noch machbar.
Versuchen Sie Folgendes:
%Vor%Nehmen wir an, wir haben die folgenden Funktionen:
%Vor% Alle Aufrufe von return_void
geben true zurück, solange sie mit den ersten sechs Funktionen aufgerufen werden. Der Aufruf return_void(l)
und return_void(m)
gibt false zurück, weil sie die zweite Version der Vorlage aufrufen, die eine Falsch zurückgeben.
Damit können Sie überprüfen, ob eine Funktion void
zur Laufzeit und zur Kompilierzeit zurückgibt: