Perfect forwarding
- C++ kursu
- İleri seviye
- Ders 10/83
- 5 dk
Perfect forwarding ile argüman aktarımı öğrenirsin.
Perfect forwarding
Perfect forwarding, bir fonksiyonun bağımsız değişkenlerini başka bir fonksiyona olduğu gibi (sol değer ise sol değer, sağ değer ise sağ değer) aktarmasıdır. Bunun için universal reference T&& ve std::forward<T> kullanılır.
Örnek: template <typename T> void wrapper(T&& x) { impl(std::forward<T>(x)); } Burada T&& hem sol hem sağ değerleri kabul eder; std::forward<T> ise değer kategorisini korur. Bu, sarma (wrapper) fonksiyonlarında gereksiz kopyaları önler.
Universal reference
Universal reference, şablon parametresi çıkarımı sırasında T&& biçiminde görünen bir referans türüdür. Sol değer bağımsız değişken için T = X&, sağ değer için T = X çıkar. Böylece tek bir parametre her iki tarafı da kabul eder.
Bu davranış yalnızca şablon parametresi çıkarımı sırasında geçerlidir. int&& x gibi somut bir tür yalnızca sağ değer kabul eder. Universal reference, std::vector'ün push_back(T&&) ve emplace_back(Args&&...) üye fonksiyonlarında kullanılır.
Uygulama wrapper şablonunu yaz
template <typename T> void impl(T&& x) gövdesi std::cout << x; olsun. Daha sonra template <typename T> void wrapper(T&& x) yaz ve gövdede impl(std::forward<T>(x)); çağır. main içinde wrapper(42); çağır.
Başlangıç kodu
#include <iostream>
#include <utility>
// impl ve wrapper şablonlarını yaz
int main() {
// wrapper fonksiyonunu 42 ile çağır
return 0;
}Örnek çözüm
#include <iostream>
#include <utility>
template <typename T>
void impl(T&& x) {
std::cout << x;
}
template <typename T>
void wrapper(T&& x) {
impl(std::forward<T>(x));
}
int main() {
wrapper(42);
return 0;
}Beklenen çıktı
42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
T&& x |
Universal reference |
std::forward<T>(x) |
Değer kategorisini korur |
Args&&... args |
Variadic universal pack |
std::forward<Args>(args)... |
Pack'i iletir |
2 std::forward satırını tamamla
template <typename T>
void wrapper(T&& x) {
impl(____);
}
template <typename T>
void wrapper(T&& x) {
impl(std::forward<T>(x));
}
Açıklama: std::forward<T>(x) değer kategorisini korur.
3 Hangisi perfect forwarding için kullanılır?
- std::move
- std::forward Doğru cevap
- std::swap
- std::copy
Açıklama: std::forward değer kategorisini koruyarak iletir.