enable_if Örüntüleri
Şablonları klasik yöntemle kısıtlayın
enable_if Örüntüleri, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. 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.
enable_if Nedir
std::enable_if, bir type üyesini koşullu olarak tanımlayan küçük bir özelliktir. Koşulu doğru olduğunda tür mevcut olur; yanlış olduğunda çevreleyen şablon SFINAE aracılığıyla kaldırılır.
<type_traits>içinde bulunur.- Şablonları kısıtlamak için kullanılan klasik araçtır.
#include <iostream>
#include <type_traits>
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
doubleIt(T v) { return v * 2; }
int main() {
std::cout << doubleIt(21) << '\n';
return 0;
}Nasıl Çalışır
enable_if<Cond, T>::type, yalnızca Cond doğru olduğunda T olur. Yanlış olduğunda type üyesi bulunmadığı için yerine koyma başarısız olur.
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::boolalpha;
std::cout << std::is_same<std::enable_if<true, int>::type, int>::value << '\n';
return 0;
}Dönüş Türünde enable_if
En yaygın kullanım yeri dönüş türüdür. İşlev yalnızca koşul sağlandığında mevcut olur.
#include <iostream>
#include <type_traits>
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
half(T v) { return v / 2; }
int main() {
std::cout << half(5.0) << '\n';
return 0;
}Şablon Parametresi Olarak enable_if
Başka bir kullanım biçiminde enable_if, varsayılan değeri olan bir şablon parametresine yerleştirilir ve dönüş türü temiz tutulur.
#include <iostream>
#include <type_traits>
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
T triple(T v) { return v * 3; }
int main() {
std::cout << triple(4) << '\n';
return 0;
}enable_if_t Kısayolu
C++14, typename ...::type kullanımındaki gereksiz ayrıntıları atlayabilmeniz için std::enable_if_t<Cond, T> takma adını ekledi.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_integral<T>::value, T>
negate(T v) { return -v; }
int main() {
std::cout << negate(8) << '\n';
return 0;
}İki Aşırı Yüklemeyi Eşleştirme
Her tür için tam olarak bir aşırı yüklemenin geçerli olması ve belirsizlik oluşmaması için birbirini tamamlayan koşullar sağlayın.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_integral<T>::value, const char*>
category() { return "integer"; }
template <typename T>
std::enable_if_t<!std::is_integral<T>::value, const char*>
category() { return "non-integer"; }
int main() {
std::cout << category<int>() << ' ' << category<double>() << '\n';
return 0;
}Koşulları Birleştirme
"Tamsayı türünde ve işaretli" gibi daha kapsamlı kısıtlamaları ifade etmek için tür özelliği değerleri üzerinde mantıksal işleçler kullanın.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_integral<T>::value && std::is_signed<T>::value, T>
magnitude(T v) { return v < 0 ? -v : v; }
int main() {
std::cout << magnitude(-12) << '\n';
return 0;
}Bir Kurucuyu Kısıtlama
Bir kurucunun şablon parametresine enable_if yerleştirerek kurucunun yalnızca uyumlu türler için kullanılmasına izin verebilirsiniz.
#include <iostream>
#include <type_traits>
struct Wrapper {
int value;
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
Wrapper(T v) : value(static_cast<int>(v)) {}
};
int main() {
Wrapper w(42);
std::cout << w.value << '\n';
return 0;
}Varsayılan Şablon Bağımsız Değişkeninin Tuzakları
Yalnızca varsayılan değeri olan enable_if şablon parametresi bakımından farklılaşan iki aşırı yükleme yeniden tanımlama olarak değerlendirilir. Bunlara farklı biçimler verin; örneğin bir koşulu dönüş türüne yerleştirin.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_integral<T>::value, void>
printKind() { std::cout << "int\n"; }
template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, void>
printKind() { std::cout << "float\n"; }
int main() {
printKind<int>();
printKind<double>();
return 0;
}Kavramlarla Karşılaştırma
C++20 kavramları, enable_if kullanımının çoğunu çok daha açık bir söz dizimiyle değiştirir; ancak enable_if, C++20 öncesi kodlar ve bazı özel durumlar için önemini korur.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_arithmetic<T>::value, T>
square(T v) { return v * v; }
int main() {
std::cout << square(6) << ' ' << square(1.5) << '\n';
return 0;
}Eksiksiz Bir Örnek
Her şeyi birleştirin: tamsayıları ve kayan noktalı sayıları farklı biçimlendiren, derleme zamanında seçilen bir işlev ailesi.
#include <iostream>
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_integral<T>::value, void>
format(T v) { std::cout << "int[" << v << "]\n"; }
template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, void>
format(T v) { std::cout << "float(" << v << ")\n"; }
int main() {
format(10);
format(3.5);
return 0;
}Kısa Kontrol
enable_if'yi anlayıp anlamadığınızı test edin.
Özet
Klasik enable_if kalıplarını öğrendiniz:
- yalnızca koşul doğru olduğunda
::typetanımlayarak SFINAE'yi etkinleştirir - dönüş türüne veya varsayılan değeri olan bir şablon parametresine yerleştirilir
enable_if_ttakma adını kullanabilir ve tür özelliklerini mantıksal işleçlerle birleştirebilirsiniz- C++20'de yerini kavramlara bırakmıştır, ancak hâlâ yaygın olarak kullanılır
Şablon Özelleştirme ve SFINAE kursu tamamlandı.
Sıkça Sorulan Sorular
“enable_if Örüntüleri” dersi ücretsiz mi?
Evet — “enable_if Örüntüleri” 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.
“enable_if Örüntüleri” dersinde ne öğreneceğim?
Şablonları klasik yöntemle kısıtlayın 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 4. dersidir.
“enable_if Örüntüleri” 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