CRTP İdiomu
Merak uyandıran yinelenen şablon örüntüsü
CRTP İdiomu, 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.
CRTP Nedir
Merak Uyandırıcı Yinelemeli Şablon Deseni (CRTP), bir sınıfın kendisiyle örneklenmiş bir şablon taban sınıftan Derived kalıtım aldığı bir C++ deyimidir.
- Biçim:
class Derived : public Base<Derived> - Taban sınıf, türetilmiş türü derleme zamanında öğrenir
template <typename T>
class Base {};
class Derived : public Base<Derived> {};Temel Mekanizma
Taban sınıfın içinde this işaretçisini türetilmiş türe dönüştürmek için static_cast kullanabilirsiniz. Türetilmiş tür bir şablon parametresi olduğundan bu, çalışma zamanı maliyeti olmayan, tamamen derleme zamanında yapılan bir dönüştürmedir.
#include <iostream>
template <typename T>
class Base {
public:
void interface() {
static_cast<T*>(this)->implementation();
}
};
class Derived : public Base<Derived> {
public:
void implementation() { std::cout << "Derived impl\n"; }
};
int main() {
Derived d;
d.interface();
return 0;
}Neden "Merak Uyandırıcı Yinelemeli"
Bu ad, görünürdeki çelişkiden gelir: Taban sınıf, taban şablonu yazılırken henüz tam olarak tanımlanmamış olan türetilmiş sınıfa başvurur.
- Şablonlar yalnızca kullanıldıklarında örneklendiği için çalışır
- Örnekleme zamanında
Derivedeksiksiz bir türdür
İlk Gerçek Kullanım
CRTP, taban sınıfın türetilmiş sınıfa geri çağrı yapan yeniden kullanılabilir işlevsellik sağlamasına olanak tanır. Burada taban sınıf, türetilmiş sınıftaki name() işlevine yönlendiren bir print() sağlar.
#include <iostream>
#include <string>
template <typename T>
struct Named {
void print() {
std::cout << static_cast<T*>(this)->name() << "\n";
}
};
struct Cat : Named<Cat> {
std::string name() { return "Cat"; }
};
int main() {
Cat c;
c.print();
return 0;
}Sanal İşlev Tabloları Yok
Çalışma zamanı çok biçimliliğinin aksine CRTP, virtual anahtar sözcüğüne veya her nesnede bir sanal işlev tablosu işaretçisine ihtiyaç duymaz. Çağrıların dağıtımı tamamen derleme zamanında çözülür.
- Daha küçük nesneler (gizli vptr yoktur)
- Çağrılar satır içine alınabilir
Örnekleri Sayma
CRTP'nin klasik bir uygulaması nesne sayacıdır. Her türetilmiş sınıf otomatik olarak kendi statik sayacını alır.
#include <iostream>
template <typename T>
struct Counter {
static inline int count = 0;
Counter() { ++count; }
~Counter() { --count; }
};
struct Widget : Counter<Widget> {};
int main() {
Widget a, b;
std::cout << Widget::count << "\n";
return 0;
}Her Türetilmiş Tür Kendi Durumunu Alır
Counter<Widget> ve Counter<Gadget> farklı şablon örneklemeleri olduğundan her birinin bağımsız bir statik count değeri vardır. Bu ayrım, tek bir şablon olmayan taban sınıfla mümkün değildir.
#include <iostream>
template <typename T>
struct Counter {
static inline int count = 0;
Counter() { ++count; }
};
struct A : Counter<A> {};
struct B : Counter<B> {};
int main() {
A a1, a2;
B b1;
std::cout << A::count << " " << B::count << "\n";
return 0;
}static_cast Burada Güvenlidir
Taban sınıf içindeki aşağı yönlü dönüştürme yalnızca Base<T> türündeki her nesne gerçekten bir T ise güvenlidir. CRTP bunu yapı gereği garanti eder; çünkü T, kalıtım alan sınıftır.
- İlişkisiz bir sınıf için hiçbir zaman
Base<Wrong>örneklemeyin
CRTP ile Karşılaştırma İşleçleri
Bir karşılaştırma yardımcı sınıfından türeterek tek bir operator< üzerinden eksiksiz bir karşılaştırma işleçleri kümesi oluşturabilirsiniz.
#include <iostream>
template <typename T>
struct Comparable {
friend bool operator>(const T& a, const T& b) { return b < a; }
friend bool operator==(const T& a, const T& b) { return !(a < b) && !(b < a); }
};
struct Num : Comparable<Num> {
int v;
Num(int x) : v(x) {}
friend bool operator<(const Num& a, const Num& b) { return a.v < b.v; }
};
int main() {
std::cout << (Num(3) > Num(2)) << "\n";
return 0;
}Korumalı Kurucu Güvencesi
Taban sınıfın yanlışlıkla kullanılmasını önlemek için ona yalnızca türetilmiş sınıfların oluşturabileceği bir protected kurucu verin.
#include <iostream>
template <typename T>
class Base {
protected:
Base() = default;
public:
void run() { static_cast<T*>(this)->step(); }
};
class Job : public Base<Job> {
public:
void step() { std::cout << "step\n"; }
};
int main() {
Job j;
j.run();
return 0;
}Standart Kütüphanelerde CRTP
CRTP, gerçek C++ kütüphanelerinde yaygın olarak kullanılır.
std::enable_shared_from_this<T>bunu kullanır- Birçok ifade şablonlu matematik kütüphanesi (Eigen) buna dayanır
- Aralıklar ve yineleyici yardımcıları benzer kalıplar kullanır
X : Base<X> biçimini tanımak, ileri düzey kodları okumanıza yardımcı olur.
Kısa Kontrol
CRTP biçimini anlayıp anlamadığınızı test edin.
Özet
CRTP deyimini öğrendiniz.
Derived : Base<Derived>, taban sınıfa somut türünü verirstatic_cast<T*>(this), derleme zamanında dağıtımı etkinleştirir- Sanal işlev tablosu yoktur; nesneler daha küçüktür ve çağrılar satır içine alınabilir
- Sayaçlar, karşılaştırma karışımları ve kütüphane yardımcıları için kullanılır
Sıkça Sorulan Sorular
“CRTP İdiomu” dersi ücretsiz mi?
Evet — “CRTP İdiomu” 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.
“CRTP İdiomu” dersinde ne öğreneceğim?
Merak uyandıran yinelenen şablon örüntüsü 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.
“CRTP İdiomu” 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.