0 Tage Serie
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.