capypad
0 Tage Serie
cpp / expert
Snippet

C++23 Explizite Objektparameter (Deduced This)

C++23 führte 'deduced this' ein, wodurch Elementfunktionen 'this' als expliziten Parameter entgegennehmen können. Dies vereinfacht das Schreiben von Code, der von der Value-Category (lvalue/rvalue) oder den cv-Qualifikatoren des aufrufenden Objekts abhängt, ohne Funktionen duplizieren zu müssen.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <typeinfo>
 
struct Logger {
template <typename Self>
void log_type(this Self&& self) {
std::cout << "Called on type: " << typeid(Self).name() << "\n";
}
};
 
int main() {
Logger l;
l.log_type(); // Deduces Logger&
std::move(l).log_type(); // Deduces Logger&&
}
Erklärung
1
void log_type(this Self&& self)
Das Schlüsselwort 'this' vor dem ersten Parameter macht diesen zu einem expliziten Objektparameter.
2
template <typename Self>
Self wird auf den exakten Typ und die Value-Category des Objekts abgeleitet, auf dem die Funktion aufgerufen wird.