enable_if
- C++ kursu
- İleri seviye
- Ders 15/83
- 5 dk
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
#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
#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
template <typename T, typename = std::____<std::is_integral_v<T>>
T add_one(T x) { return x + 1; }
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.