Menu
Coddy logo textTech

Fonksiyon Şablonları

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 64 / 104.

İki tamsayının maksimumunu bulacak bir fonksiyon yazdığınızı, ardından aynı mantığa double değerleri ve tekrar dizeler için ihtiyaç duyduğunuzu düşünün. Şablonlar olmadan her tür için neredeyse aynı fonksiyonları yazmanız gerekirdi. Fonksiyon şablonları, mantığı bir kez yazmanıza ve derleyicinin türe özgü sürümleri otomatik olarak oluşturmasına olanak tanıyarak bu sorunu çözer.

Bir fonksiyon şablonu, template anahtar sözcüğünü açılı ayraçlar içinde şablon parametreleri izleyerek kullanır:

template <typename T>
T maximum(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    std::cout << maximum(5, 3) << std::endl;       // int sürümünü kullanır
    std::cout << maximum(3.14, 2.71) << std::endl; // double sürümünü kullanır
    std::cout << maximum('a', 'z') << std::endl;   // char sürümünü kullanır
}

şablon örneklemesi adı verilir. Gerektiğinde türü açıkça da belirtebilirsiniz:

std::cout << maximum<double>(5, 3.14) << std::endl;  // double sürümünü zorlar

Şablonlar birden fazla tür parametresine sahip olabilir ve böylece daha da esnek tasarımlar sağlar:

template <typename T, typename U>
void printPair(T first, U second) {
    std::cout << first << ", " << second << std::endl;
}

printPair(42, "hello");    // T=int, U=const char*
printPair(3.14, 100);      // T=double, U=int

Fonksiyon şablonları, derleme zamanı çok biçimliliği sağlar; tür, çalışma zamanında değil, kod derlendiğinde belirlenir. Bu, sanal fonksiyonlara kıyasla çalışma zamanı ek yükünün sıfır olduğu anlamına gelir ve şablonları performansa duyarlı jenerik kodlar için ideal kılar.

challenge icon

Görev

Kolay

Her uyumlu türle çalışan yeniden kullanılabilir işlemler oluşturmak için işlev şablonlarını kullanarak bir yardımcı araç seti oluşturalım. Genel işlevlerini bir başlık dosyasında düzenleyecek ve ana programında esnekliklerini göstereceksin.

İki dosya oluşturacaksın:

  • MathUtils.h: Yaygın işlemleri gerçekleştiren bir işlev şablonları koleksiyonu tanımla:

    minimum: Aynı türden iki değer alan ve küçük olanı döndüren bir şablon işlevi.

    clamp: Üç parametre alan bir şablon işlevi: bir değer, bir alt sınır ve bir üst sınır. Değeri sınırlar içinde kısıtlanmış olarak döndürür (değer alt sınırdan küçükse alt sınırı, üst sınırdan büyükse üst sınırı, aksi takdirde değerin kendisini döndürür).

    swapValues: Aynı türden iki başvuru alan ve değerlerini birbiriyle değiştiren bir şablon işlevi.

  • main.cpp: Altı girdi oku (her biri ayrı bir satırda):

    1. İlk tam sayı
    2. İkinci tam sayı
    3. Sınırlandırılacak bir double değeri
    4. Alt sınır (double)
    5. Üst sınır (double)
    6. Bir karakter

    Şablonlarını şu işlemleri yaparak göster:

    1. İki tam sayıdan küçüğünü bul ve şunu yazdır: Min of <a> and <b>: <result>
    2. Karakterlerden 'm' ile girdiğin karakterin küçüğünü bul ve şunu yazdır: Min of m and <char>: <result>
    3. Double değerini sınırlandır ve şunu yazdır: Clamp <value> to [<low>, <high>]: <result>
    4. İlk tam sayıyı [0, 100] aralığıyla sınırlandır ve şunu yazdır: Clamp <value> to [0, 100]: <result>
    5. İki tam sayının yerlerini değiştir ve şunu yazdır: After swapValues: <a>, <b>

Örneğin, girdiler 25, 10, 3.7, 1.0, 5.0 ve z olduğunda:

Min of 25 and 10: 10
Min of m and z: m
Clamp 3.7 to [1, 5]: 3.7
Clamp 25 to [0, 100]: 25
After swapValues: 10, 25

Her şablon işlevinin tam sayılar, double değerleri ve karakterlerle nasıl sorunsuz çalıştığına dikkat et: derleyici, kullandığın her tür için uygun sürümü oluşturur. swapValues işlevin, başvurular aracılığıyla özgün değişkenleri değiştirmelidir; bu da şablonların tıpkı normal işlevler gibi başvuru parametreleriyle çalıştığını gösterir.

Kendin dene

#include <iostream>
#include "MathUtils.h"
using namespace std;

int main() {
    // Girdileri oku
    int a, b;
    double value, low, high;
    char ch;
    
    cin >> a;
    cin >> b;
    cin >> value;
    cin >> low;
    cin >> high;
    cin >> ch;
    
    // TODO: İki tamsayının minimumunu bulmak için minimum şablonunu kullan
    // Yazdır: "Min of <a> and <b>: <result>"
    
    // TODO: 'm' ve girdi karakterinin minimumunu bulmak için minimum şablonunu kullan
    // Yazdır: "Min of m and <char>: <result>"
    
    // TODO: double değer üzerinde clamp şablonunu kullan
    // Yazdır: "Clamp <value> to [<low>, <high>]: <result>"
    
    // TODO: İlk tamsayı üzerinde [0, 100] aralığıyla clamp şablonunu kullan
    // Yazdır: "Clamp <value> to [0, 100]: <result>"
    
    // TODO: İki tamsayı üzerinde swapValues şablonunu kullan
    // Print: "After swapValues: <a>, <b>"
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi