2016-08-08 37 views
2

Ich habe ein Makro wie folgt aus:Vergleichen Eingabeparameter von C++ Makro

#define M(x) 

ich überprüfen x wollen, wenn es um void oder nicht gleich ist. So etwas Ähnliches:

#define M(x) 
    if(x == void) 
     do not return anything 
    else 
     print a output 

Problem ist, dass x alles sein kann. M kann mit beliebigen Parametern aufgerufen werden. M (int) M (string) M (void)

Ich möchte dieses Makro kann Eingabeparameter werden erkennen void ist.

Update 1: besser

Diese erklären ist eine Funktion Schöpfer Makro. Wie die (einfacher Code)

#define M(ret, name) \ 
    ret name(){ \ 
     ret r = callOtherFunc(); \ 
     return r; \ 
    } 

Und ich will, wenn ret Leere ist dann die Zeile 'return ...' entfernt

Update 2: Forget Vorlage

Bitte schlagen nicht mit Vorlagen. Dies ist ein Teil einer größeren Lösung. Dieser kleine Teil der Lösung kann mit Vorlagen gelöst werden, aber die größere Lösung muss mit Makros gelöst werden. Also bitte posten Sie Ihre Antworten nur im Zusammenhang mit Makro und nicht Vorlage.

+2

können Sie nicht. Der C++ - Präprozessor ist dafür nicht ausgelegt. –

+5

Verwenden Sie Vorlagen für diese – KIIV

+0

"Forget-Vorlage" - Sie müssen erklären, warum Sie nicht Vorlagen * für dieses kleine * verwenden können. Es ist nichts falsch daran, Vorlagen und Makros zu mischen (das ist oft der beste Weg). –

Antwort

0

Yo kann das nicht tun. Die Macro sind nicht typsicher. Das ist eine Makrodefinition für int Betrieb kann andere Daten wie float nicht akzeptieren. Sie werden ohne Typprüfung erläutert.

So können Sie Vorlage Funktion verwenden.

2
#define M(x) std::is_same<x,void>::value 

Die Prüfung mit void geschieht nach Vorverarbeitungsstufe. Obwohl oben der richtige Weg ist, darf ich in echtem Code nicht machen. Sie haben jedoch nicht den vollständigen Kontext dessen angegeben, was Sie genau wollen. Daher stelle ich dies als eine Antwort dar.

Update 1: Es scheint, dass Sie eine Funktionen mithilfe von Makros erstellen möchten. Und diese geben Fehler nur für die void Typen, weil ein Objekt ein Objekt void nicht zurückgeben kann. Hier ist, wie Sie es tun sollten:

#define M(ret, name) \ 
    ret name(){ \ 
     return callOtherFunc(); \ // not storing in temporary 
    } 

Demo.

Aber ich fühle immer noch, dass Sie vielleicht etwas mehr wollen. Versuchen Sie daher, ein gut überprüfbares Beispiel zu erstellen, das alles enthält, was Sie wollen.

+0

Problem ist nicht temporäre Speicherung von Variablen. Problem ist: > Und diese geben Fehler nur für die Void-Typen, weil ein Objekt nicht ein Objekt von void –

+0

@BlackDal zurückgeben kann, können Sie nicht dasselbe Makro für 'void' und andere Typen verwenden, falls Sie beabsichtigen, die Variable zu speichern vorübergehend. Wahrscheinlich kannst du dein genaues Problem in der Frage mit größerem Bild beschreiben, damit Leute helfen können. – iammilind

0

Eine alternative Möglichkeit ist, Vorlagen zu verwenden:

template <typename T> void M(){ 
    if(std::is_same<T,void>::value){ 
     std::cout << "void!\n"; 
    } 
    else{ 
     std::cout <<"Not void!\n"; 
    } 
} 

int main(){ 
    M<void>(); 
    M<int>(); 
} 

Ergebnis:

Leere!

Nicht void!

Live Demo