0Pricing
C++ Academy · Ders

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 ::type tanımlayarak SFINAE'yi etkinleştirir
  • dönüş türüne veya varsayılan değeri olan bir şablon parametresine yerleştirilir
  • enable_if_t takma 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

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