Defines haben definitiv ihre Anwendungsbereiche. Plattformspezifische und Compilerspezifische Funktionen kann man am einfachsten mit Defines auswählen. Templates sind dafür ungeeignet und ich muss TrommlBomml teilweise zustimmen. Ich halte es auch für fragwürdig,
#define zu vermeiden, bloß weil es
#define heißt und "böse" sein soll. Defines haben ganz klar
ihre negativen Seiten aber es gibt auch Positive. Im Falle von Typdefinitionen ist hauptsächlich störend, dass DEFINES IMMER GROẞGESCHRIEBEN sein müssen, damit sie nicht mit den anderen Namen kollidieren. Außerdem gibt es keine Namensräume für Makros womit lange Präfixe notwendig sind.
Es gibt allerdings nach wie vor eine unglaublich lange Liste von Dingen bei denen
#define die beste Lösung ist.
Von bedingter Kompilierung und Plattformspezfischen Code und einfachen Dingen wie
#define THREADLOCAL __declspec(thread) über Reduzierung der Tipparbeit bis zu Dingen wie das Generieren von "MetaDaten" bzw. Reflection-Informationen. Als Beispiel für ein wahnsinniged Präprozessorkonstrukt gibt es in meinen Code zum Beispiel Makros um die unzähligen Abkömlinge von
glUniform und den ganzen
Extensions und
das in ein Template zu bekommen, dass für einen gegebenen C++-Typ automatisch die richtige Funktion aufruft. Ohne Präprozessor wären das tausende Zeilen Glue-Code die noch viel schwerer zu warten wären als 300 Zeilen Präprozessorhölle.