C++-Programmierung: SFINAE-Technik anwenden, Kompilierungsfehler verhindern

Das Ersetzen von Typparametern führt oft zu vermeintlichen Kompilierfehlern. Mit Techniken wie SFINAE lassen diese sich für nützliche Zwecke einsetzen.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Programmiertechnik SFINAE für Member Checker und bedingte Kompilierung anwenden
Lesezeit: 15 Min.
Von
  • Detlef Wilkening
Inhaltsverzeichnis

SFINAE steht für "Substitution failure is not an error" und bezeichnet eine Regel, die während der Überladungsauflösung von Funktionstemplates gilt. Schlägt das Ersetzen eines explizit angegebenen oder abgeleiteten Typs in der Signatur für den Templateparameter fehl, wird das Funktionstemplate aus dem Überladungssatz entfernt, anstatt einen Kompilierfehler zu verursachen.

Aktuelle und kommende C++-Standards versuchen mit std::enable_if (C++11) oder std::void_t (C++17) die Nutzung von SFINAE zu vereinfachen oder mit constexpr if (C++17) oder Concepts (C++20) einfacher zu nutzende Alternativen zu SFINAE anzubieten. Trotzdem ist der Einsatz von SFINAE noch immer aktuell. C++11 führte Expression SFINAE ein und in C++20 wird SFINAE auf den Explicit Specifier erweitert. Hintergrund ist, dass SFINAE in der Metaprogrammierung immer noch eine notwendige Technik ist, die meisten Type Traits in C++ damit implementiert sind und die Range-Bibliothek in C++20 ausgiebigen Gebrauch davon macht.

Zum Verstehen von Templatemechanismen dient folgendes Beispiel: Überladene Funktionen (tragen den gleichen Namen und unterscheiden sich in der Signatur) stellen bei einem Funktionsaufruf über den Namen mögliche Kandidaten für den eigentlichen Aufruf dar. Der Compiler entscheidet anhand der Argumenttypen und Signaturen, welche Funktion am besten passt, und ruft sie auf: