0Pricing
C++ Academy · Ders

Kısmi Özelleştirme

Şablon örüntülerini özelleştirin

Kısmi Özelleştirme, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

Kısmi Özelleştirme Nedir

Kısmi özelleştirme, tek bir kesin tür yerine ortak bir kalıbı paylaşan bir tür ailesi için bir şablonu özelleştirir.

  • Yalnızca sınıf şablonları bunu destekler.
  • Bazı parametreleri hâlâ genel bırakırsınız.
#include <iostream>

template <typename T>
struct Traits { static const char* kind() { return "value"; } };

template <typename T>
struct Traits<T*> { static const char* kind() { return "pointer"; } };

int main() {
    std::cout << Traits<int>::kind() << '\n';
    std::cout << Traits<int*>::kind() << '\n';
    return 0;
}

İşaretçilerle Eşleşme

T* kalıbı her işaretçi türüyle eşleşir ve tüm işaretçileri tek bir özelleştirmeyle işlemenizi sağlar.

#include <iostream>

template <typename T>
struct Deref { static T get(T v) { return v; } };

template <typename T>
struct Deref<T*> { static T get(T* p) { return *p; } };

int main() {
    int x = 42;
    std::cout << Deref<int>::get(7) << '\n';
    std::cout << Deref<int*>::get(&x) << '\n';
    return 0;
}

İşlevler Kısmen Özelleştirilemez

Yalnızca sınıf ve değişken şablonları kısmi özelleştirmeyi destekler. İşlevler için bunun yerine aşırı yükleme kullanılır.

#include <iostream>

template <typename T>
void show(T) { std::cout << "value\n"; }

template <typename T>
void show(T*) { std::cout << "pointer\n"; }

int main() {
    int x = 0;
    show(5);
    show(&x);
    return 0;
}

İki Parametreden Birini Özelleştirme

Birden çok tür parametresiyle birini sabitleyip diğerini açık bırakabilir, böylece türler arasındaki bir kalıpla eşleşebilirsiniz.

#include <iostream>

template <typename A, typename B>
struct Pair { static const char* kind() { return "mixed"; } };

template <typename A>
struct Pair<A, A> { static const char* kind() { return "same types"; } };

int main() {
    std::cout << Pair<int, double>::kind() << '\n';
    std::cout << Pair<int, int>::kind() << '\n';
    return 0;
}

Dizilerle Eşleşme

Öğe türünü ve tür dışı bir parametre olarak boyutu yakalayan bir kalıpla dizi türleriyle eşleşebilirsiniz.

#include <iostream>

template <typename T>
struct Info { static int size() { return 1; } };

template <typename T, int N>
struct Info<T[N]> { static int size() { return N; } };

int main() {
    std::cout << Info<int>::size() << '\n';
    std::cout << Info<int[5]>::size() << '\n';
    return 0;
}

Sabitlik Kalıpları

Bir özelleştirme, kalıp olarak const T ile eşleşerek const niteliğini kaldırabilir veya algılayabilir.

#include <iostream>

template <typename T>
struct IsConst { static const bool value = false; };

template <typename T>
struct IsConst<const T> { static const bool value = true; };

int main() {
    std::cout << std::boolalpha;
    std::cout << IsConst<int>::value << '\n';
    std::cout << IsConst<const int>::value << '\n';
    return 0;
}

En Özelleştirilmiş Olan Kazanır

Birden çok özelleştirme eşleşebildiğinde derleyici, en özelleştirilmiş olanı, yani en belirgin kalıbı seçer.

#include <iostream>

template <typename T>
struct K { static int v() { return 0; } };

template <typename T>
struct K<T*> { static int v() { return 1; } };

template <>
struct K<int*> { static int v() { return 2; } };

int main() {
    std::cout << K<double*>::v() << ' ' << K<int*>::v() << '\n';
    return 0;
}

Başvuru Kalıpları

Başvuru türleriyle de eşleşebilir ve bir başvuruyu yalın bir değerden ayırt edebilirsiniz.

#include <iostream>

template <typename T>
struct Cat { static const char* k() { return "value"; } };

template <typename T>
struct Cat<T&> { static const char* k() { return "lvalue ref"; } };

int main() {
    std::cout << Cat<int>::k() << '\n';
    std::cout << Cat<int&>::k() << '\n';
    return 0;
}

Tür Özellikleri Oluşturma

Kısmi özelleştirme, tür özelliklerinin temelini oluşturur. İşte elle yazılmış bir remove_pointer.

#include <iostream>
#include <type_traits>

template <typename T>
struct RemovePtr { using type = T; };

template <typename T>
struct RemovePtr<T*> { using type = T; };

int main() {
    std::cout << std::boolalpha;
    std::cout << std::is_same<RemovePtr<int*>::type, int>::value << '\n';
    return 0;
}

Kalıpları Birleştirme

Katmanlı tür yapılarını işlemek için örneğin sabit bir değere işaretçiyle eşleşmek üzere kalıpları birleştirebilirsiniz.

#include <iostream>

template <typename T>
struct Desc { static const char* k() { return "plain"; } };

template <typename T>
struct Desc<const T*> { static const char* k() { return "ptr to const"; } };

int main() {
    std::cout << Desc<int>::k() << '\n';
    std::cout << Desc<const int*>::k() << '\n';
    return 0;
}

Uygulamalı Bir Kapsayıcı Özelliği

Kapsayıcı benzeri bir şablonun öğe türünü çıkarmak için kısmi özelleştirme kullanın.

#include <iostream>
#include <type_traits>

template <typename C>
struct Element { using type = void; };

template <template <typename> class C, typename T>
struct Element<C<T>> { using type = T; };

template <typename T>
struct Box { T item; };

int main() {
    std::cout << std::boolalpha;
    std::cout << std::is_same<Element<Box<int>>::type, int>::value << '\n';
    return 0;
}

Kısa Kontrol

Kısmi özelleştirmeyi anlayıp anlamadığınızı test edin.

Özet

Kısmi özelleştirmeyi öğrendiniz:

  • T* veya const T gibi bir tür kalıbı için sınıf şablonunu özelleştirir
  • işlevler kısmi özelleştirme yerine aşırı yükleme kullanır
  • eşleşen en özelleştirilmiş sürüm seçilir
  • remove_pointer gibi tür özelliklerinin temelini oluşturur

Sırada, yalnızca bir tür uygun olduğunda işlevleri etkinleştirmenin bir yolu olan SFINAE'yi öğreneceksiniz.

Sıkça Sorulan Sorular

“Kısmi Özelleştirme” dersi ücretsiz mi?

Evet — “Kısmi Özelleştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Kısmi Özelleştirme” dersinde ne öğreneceğim?

Şablon örüntülerini özelleştirin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Kısmi Özelleştirme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tam Özelleştirme
  2. Kısmi Özelleştirme
  3. SFINAE
  4. enable_if Örüntüleri
← C++ Academy Sayfasına Dön