CodeBlanks Logo Icon CodeBlanks

Perfect forwarding

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

main.cpp
#include <iostream>
#include <utility>

// impl ve wrapper şablonlarını yaz

int main() {
    // wrapper fonksiyonunu 42 ile çağır
    return 0;
}

Örnek çözüm

main.cpp
#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

Soru
template <typename T>
void wrapper(T&& x) {
    impl(____);
}
Cevap
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.

İleri seviye bölümündeki tüm dersler