Ist es möglich, zu überprüfen, ob die Funktion einen ungültigen Rückgabetyp hat?

8

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.

%Vor%

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.

    
fritzone 07.07.2016, 11:19
quelle

5 Antworten

13

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:

%Vor%

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.

    
Anton K 07.07.2016, 11:49
quelle
4

Wenn Sie die aktuelle Funktion benennen können, ist der einfachste Weg:

%Vor%     
Mike Vine 07.07.2016 11:46
quelle
3

Sie können den Rückgabetyp der aktuellen Funktion überprüfen, indem Sie prüfen, ob eine dead return kompilieren kann:

%Vor%

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.

    
Quentin 07.07.2016 12:42
quelle
3

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.

Überprüfen Sie es online

Damit können Sie überprüfen, ob eine Funktion void zur Laufzeit und zur Kompilierzeit zurückgibt:

%Vor%     
Paula_plus_plus 07.07.2016 15:00
quelle
0

Sie müssen nur den Rückgabetyp erkennen und prüfen, ob er vom Typ void ist. Um den Typ zu überprüfen, können Sie std::is_void verwenden. Rückgabetyp kann mit folgender Vorlage erkannt werden:

%Vor%     
teivaz 07.07.2016 12:01
quelle

Tags und Links