CodeBlanks Logo Icon CodeBlanks

enable_if

enable_if ile SFINAE öğrenirsin.

enable_if (SFINAE)

std::enable_if, bir koşul doğruysa geçerli bir tür, yanlışsa hiçbir tür üretmez. Bu, SFINAE (Substitution Failure Is Not An Error) ilkesine dayanır; yanlış koşullu aşırı yükleme aday listesinden sessizce çıkarılır.

Örnek: template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>> T add_one(T x). Bu aşırı yükleme yalnızca T tamsayı ise adaydır. add_one(5) çalışır; add_one(std::string{...}) derleme hatası verir. Concepts'ten önce bu, şablon kısıtlayan temel araçtı.

enable_if_t kullanımı

enable_if_t<cond>, koşul doğruysa void (veya ikinci parametreyle belirtilen tür) döndürür. Genellikle şablonun varsayılan tür parametresi olarak verilir: template <typename T, typename = std::enable_if_t<cond>>. Bu, imzaya görünmez bir koşul ekler.

C++17'den önce typename std::enable_if<cond>::type yazılırdı. _t soneki bunu kısaltır. Modern C++'ta concepts daha okunaklı bir alternatiftir; ancak enable_if eski kodlarda yaygındır ve bilinmesi gerekir.

Uygulama add_one'u kısıtla

template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>> T add_one(T x) yaz. Gövdede return x + 1; olsun. main içinde std::cout << add_one(5); yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <type_traits>

// add_one şablonunu enable_if ile yaz

int main() {
    // add_one(5) çağır ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <type_traits>

template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
T add_one(T x) {
    return x + 1;
}

int main() {
    std::cout << add_one(5);
    return 0;
}

Beklenen çıktı

6

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 SFINAE neyin kısaltması?

  • Single Function Is Not An Error
  • Static Function In A Namespace
  • Substitution Failure Is Not An Error Doğru cevap
  • Safe Function In Any Execution

Açıklama: SFINAE, Substitution Failure Is Not An Error anlamına gelir.

2 İfadeyi rolüne eşle

Kavram Anlamı
std::enable_if_t<cond> Koşul doğruysa tür
std::is_integral_v<T> Koşul ifadesi
typename = ... Boş varsayılan argüman
add_one(5) Geçerli çağrı

3 enable_if satırını tamamla

Soru
template <typename T, typename = std::____<std::is_integral_v<T>>
T add_one(T x) { return x + 1; }
Cevap
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>
T add_one(T x) { return x + 1; }

Açıklama: enable_if_t<cond> koşul doğruysa tür üretir.

İleri seviye bölümündeki tüm dersler