cpp / expert
Snippet
Metaprogrammierung des Kontrollflusses durch Funktionsspezialisierung
Unter Nutzung von SFINAE (Substitution Failure Is Not An Error) und std::enable_if demonstriert dieses Snippet die Verzweigung des Kontrollflusses zur Kompilierzeit. Es ermöglicht dem Compiler, verschiedene Funktionsimplementierungen basierend auf den zugrunde liegenden Datentypen auszuwählen, wodurch der Overhead für Laufzeitverzweigungen entfällt.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <type_traits>#include <iostream>template <typename T>std::enable_if_t<std::is_integral_v<T>, void>process_data(T value) {std::cout << "Integral processing: " << value << std::endl;}template <typename T>std::enable_if_t<std::is_floating_point_v<T>, void>process_data(T value) {std::cout << "Precision processing: " << value << std::endl;}template <typename T>auto handle(T&& val) -> decltype(process_data(std::forward<T>(val))) {return process_data(std::forward<T>(val));}
Erklärung
1
std::enable_if_t<std::is_integral_v<T>, void>
Stellt sicher, dass diese Funktionsüberladung nur dann für den Compiler sichtbar ist, wenn T ein Ganzzahltyp ist.
2
T&& val ... std::forward<T>(val)
Implementiert Perfect Forwarding, um die Value Category (Lvalue/Rvalue) der Eingabe beizubehalten.