2009-07-05 9 views
0

Angenommen, ich habe einen C++ - Makro-CATCH, um die Fanganweisung zu ersetzen, und diesen Makro als Parameter einen regulären Ausdruck für die Variablendeklaration erhalten, wie <type_name> [*] <var_name> oder so ähnlich. Gibt es eine Möglichkeit, diese "Felder" zu erkennen und in der Makrodefinition zu verwenden?Ist es möglich, Makroargumente als reguläre Ausdrücke zu behandeln?

Zum Beispiel:

#define CATCH(var_declaration) <var_type> <var_name> = (<var_type>) exception_object; 

Würde wie arbeiten:

#define CATCH(var_type, var_name) var_type var_name = (var_type) exception_object; 

Wie in Frage gestellt, ich bin mit g ++.

Antwort

1

Sie es mit nur Makros nicht tun können, aber man kann mit einigen Helfern Code klug sein.

template<typename ExceptionObjectType> 
struct ExceptionObjectWrapper { 
    ExceptionObjectType& m_unwrapped; 

ExceptionObjectWrapper(ExceptionObjectType& unwrapped) 
: m_unwrapped(unwrapped) {} 

template<typename CastType> 
operator CastType() { return (CastType)m_wrapped; } 
}; 
template<typename T> 
ExceptionObjectWrapper<T> make_execption_obj_wrapper(T& eobj) { 
    return ExceptionObjectWrapper<T>(eobj); 
} 

#define CATCH(var_decl) var_decl = make_exception_obj_wrapper(exception_object); 

Mit diesen Definitionen

CATCH (Foo ex);

sollte arbeiten. Ich werde Faulheit zugeben, wenn ich das nicht teste (zu meiner Verteidigung habe ich Ihren Ausnahmeobjekttest nicht mit). Wenn Ausnahmeobjekt nur ein Typ sein kann, können Sie den Vorlagenparameter ExceptionObjectType loswerden. Wenn Sie außerdem die Cast-Operatoren für das exception_object selbst definieren können, können Sie die Wrapper vollständig entfernen. Ich vermute, Ausnahme_Objekt ist eigentlich eine Leere * oder etwas und Ihre Casting-Zeiger.

0

Welchen Compiler benutzen Sie? Ich habe das noch nie im gcc-Präprozessor gesehen, aber ich kann nicht mit Sicherheit sagen, dass kein Präprozessor diese Funktionalität implementieren kann.

Was könnten Sie tun, jedoch ist das Skript durch etwas laufen wie Ihr prepreprocessing zu tun sed so vor den Präprozessor Kicks zu sprechen in.

+0

Der Compiler, den ich verwende, ist g ++. Es macht mir nichts aus, einen anderen Präprozessor zu verwenden. – freitass

0

Hmmm ... Ich bin nur raten, aber warum tun Sie nicht versuchen, so etwas wie diese: :) ​​


#define CATCH(varType,varName) catch(varType& varName) { /* some code here */ } 

+0

Ich schreibe Makros dafür, weil ich das Standardkonstrukt nicht verwenden kann. – freitass

Verwandte Themen