cpp / expert
Snippet
SFINAE-basierte Interface-Erkennung für die Überladungsauflösung
Nutzt SFINAE (Substitution Failure Is Not An Error), um Funktionsüberladungen bedingt zu aktivieren. Der Compiler versucht, das decltype aufzulösen; existiert 'obj.to_string()' nicht, wird das Template ohne Fehler verworfen und auf den variadischen 'serialize'-Catch-All zurückgegriffen.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
template <typename T>auto serialize(const T& obj) -> decltype(obj.to_string(), std::string()) {return obj.to_string();}std::string serialize(...) {return "[non-serializable]";}struct Data { std::string to_string() const { return "data"; } };struct Raw { int x; };
Erklärung
1
auto serialize(const T& obj) -> decltype(obj.to_string(), std::string())
Verwendet einen Trailing Return Type und decltype, um die Existenz der Methode to_string() auf dem Typ T zu prüfen.
2
std::string serialize(...)
Die Ellipse im C-Stil bietet eine Überladung mit niedrigerer Priorität, die auf jeden Typ passt, falls die Template-Substitution fehlschlägt.