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*veyaconst Tgibi 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_pointergibi 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
- Tam Özelleştirme
- Kısmi Özelleştirme
- SFINAE
- enable_if Örüntüleri