Tam Özelleştirme
Şablonları bir türe göre özelleştirin
Tam Özelleştirme, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 1. 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.
Özet: Şablonlar
Şablon, tek bir kod parçasının birçok türle çalışmasını sağlar. Derleyici, kullandığınız her tür için somut bir sürüm oluşturur.
- Genel biçim her türü ele alır.
- Bazen bir tür özel işlem gerektirir.
#include <iostream>
template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }
int main() {
std::cout << maxOf(3, 9) << ' ' << maxOf(2.5, 1.5) << '\n';
return 0;
}Tam Özelleştirme Nedir?
Tam özelleştirme, belirli tek bir tür için tamamen ayrı bir uygulama sunar ve yalnızca o tür için genel şablonu geçersiz kılar.
#include <iostream>
template <typename T>
void describe(T) { std::cout << "some type\n"; }
template <>
void describe(int) { std::cout << "an int\n"; }
int main() {
describe(3.14);
describe(42);
return 0;
}Söz Dizimi
Tam özelleştirme, boş açılı parantezlerle template <> başlar ve özelleştirmede tam türü belirtir.
#include <iostream>
template <typename T>
struct TypeName { static const char* get() { return "unknown"; } };
template <>
struct TypeName<bool> { static const char* get() { return "bool"; } };
int main() {
std::cout << TypeName<double>::get() << '\n';
std::cout << TypeName<bool>::get() << '\n';
return 0;
}Bir Sınıf Şablonunu Özelleştirme
Sınıf şablonlarının tamamı özelleştirilebilir; böylece bir tür, birincil şablondan farklı kendi üyelerine ve davranışına sahip olur.
#include <iostream>
template <typename T>
struct Storage {
T value;
void show() { std::cout << "value: " << value << '\n'; }
};
template <>
struct Storage<bool> {
bool value;
void show() { std::cout << (value ? "true" : "false") << '\n'; }
};
int main() {
Storage<int> s{5}; s.show();
Storage<bool> b{true}; b.show();
return 0;
}Neden Özelleştirme Yapılır?
Özelleştirme, farklı mantık gerektiren türleri ele alır; örneğin const char*, işaretçi karşılaştırması yerine dize karşılaştırması gerektirir.
#include <iostream>
#include <cstring>
template <typename T>
bool equal(T a, T b) { return a == b; }
template <>
bool equal(const char* a, const char* b) { return std::strcmp(a, b) == 0; }
int main() {
std::cout << std::boolalpha;
std::cout << equal(5, 5) << '\n';
std::cout << equal("hi", "hi") << '\n';
return 0;
}Tek Bir Üyeyi Özelleştirme
Bir sınıf şablonunda, geri kalanını yeniden kullanırken belirli bir tür için yalnızca tek bir üye işlevini özelleştirebilirsiniz.
#include <iostream>
template <typename T>
struct Printer {
void print(T v) { std::cout << v << '\n'; }
};
template <>
void Printer<char>::print(char v) {
std::cout << "char: " << v << '\n';
}
int main() {
Printer<int>{}.print(7);
Printer<char>{}.print('A');
return 0;
}Eşleşen, Genel Olandan Üstündür
Tam türle eşleşen bir tam özelleştirme mevcut olduğunda, derleyici her zaman onu birincil şablona tercih eder.
#include <iostream>
template <typename T>
int rank() { return 0; }
template <>
int rank<double>() { return 99; }
int main() {
std::cout << rank<int>() << ' ' << rank<double>() << '\n';
return 0;
}Özelleştirme Birincil Şablonu İzlemelidir
Bir özelleştirme, birincil şablon görünür hâle geldikten sonra bildirilmelidir; aksi takdirde derleyicinin özelleştireceği bir şey olmaz.
#include <iostream>
template <typename T>
const char* kind() { return "generic"; }
template <>
const char* kind<float>() { return "float"; }
int main() {
std::cout << kind<int>() << ' ' << kind<float>() << '\n';
return 0;
}std Şablonlarını Özelleştirme
Kendi türleriniz için std::hash gibi bazı standart kitaplık şablonlarını özelleştirebilir ve bunların karma kapsayıcılarla çalışmasını sağlayabilirsiniz.
#include <iostream>
struct Point { int x, y; };
template <typename T>
struct Hasher { size_t operator()(const T&) { return 0; } };
template <>
struct Hasher<Point> {
size_t operator()(const Point& p) { return p.x * 31 + p.y; }
};
int main() {
Hasher<Point> h;
std::cout << h(Point{2, 3}) << '\n';
return 0;
}Değer Özelleştirmesi
Tür dışı şablon parametreleri belirli değerlere göre özelleştirilebilir; bu, derleme zamanında kullanılan tablolar için yararlıdır.
#include <iostream>
template <int N>
struct Fib { static const int value = Fib<N-1>::value + Fib<N-2>::value; };
template <>
struct Fib<0> { static const int value = 0; };
template <>
struct Fib<1> { static const int value = 1; };
int main() {
std::cout << Fib<10>::value << '\n';
return 0;
}Davranışı Tutarlı Tutun
Bir özelleştirme, ana şablonla aynı kavramsal sözleşmeyi korumalıdır; yalnızca uygulama değişmelidir. Aksi takdirde çağıranlar beklenmedik sonuçlarla karşılaşır.
#include <iostream>
template <typename T>
T zero() { return T{}; }
template <>
int zero<int>() { return 0; }
int main() {
std::cout << zero<int>() << ' ' << zero<double>() << '\n';
return 0;
}Kısa Kontrol
Tam özelleştirme söz dizimini anlayıp anlamadığınızı test edin.
Özet
Tam özelleştirmeyi öğrendiniz:
- tek bir kesin tür için özel bir uygulama sağlar
template <>ve somut tür kullanılarak yazılır- derleyici her zaman kesin bir özelleştirmeyi tercih eder
- işlevler, sınıflar, tekil üyeler ve belirli değerlerle çalışır
Sırada, tür kalıplarıyla eşleşen kısmi özelleştirmeyi göreceksiniz.
Sıkça Sorulan Sorular
“Tam Özelleştirme” dersi ücretsiz mi?
Evet — “Tam Ö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.
“Tam Özelleştirme” dersinde ne öğreneceğim?
Şablonları bir türe göre ö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 1. dersidir.
“Tam Ö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