if constexpr
- C++ kursu
- İleri seviye
- Ders 3/83
- 5 dk
if constexpr ile derleme zamanı koşulu öğrenirsin.
if constexpr
if constexpr (C++17), derleme zamanında değerlendirilen bir koşuldur. false olan dal derlenmez; böylece tür uyumsuzluğu hatası alınmaz. Şablonlarda farklı türler için farklı kod yazmayı kolaylaştırır.
Örnek: if constexpr (std::is_integral_v<T>) return x * 2; else return x; Tamsayılar için çift katı, diğerleri için değeri döndürür. false dalı derlenmediği için std::string ile x * 2 hatası çıkmaz.
Şablonlarda kullanım
Bir şablon hem tamsayı hem de ondalık türlerle çağrılabilir. if constexpr ile her tür için ayrı kod yazılır; if kullansaydık her iki dal da derlenir ve std::string * 2 gibi anlamsız kod hataya yol açardı.
Koşullar için <type_traits> başlığında std::is_integral_v, std::is_floating_point_v gibi sabitler vardır. Bu sabitler true veya false döndürür; if constexpr bu değeri derleme zamanında okur.
Uygulama twice şablonunu yaz
template <typename T> auto twice(T x) şablonunu yaz. if constexpr ile std::is_integral_v<T> doğruysa x * 2 döndür; değilse x döndür. main içinde twice(5) çağır ve sonucu yazdır.
Başlangıç kodu
#include <iostream>
#include <type_traits>
// twice şablonunu yaz
int main() {
// twice(5) çağır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <type_traits>
template <typename T>
auto twice(T x) {
if constexpr (std::is_integral_v<T>) return x * 2;
return x;
}
int main() {
std::cout << twice(5);
return 0;
}Beklenen çıktı
10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 if constexpr ne zaman dalları eler?
- Çalışma zamanında
- Bağlantı zamanında
- Derleme zamanında Doğru cevap
- Yükleme zamanında
Açıklama: if constexpr derleme zamanında dalları değerlendirir.
2 Dalı amacına eşle
| Kavram | Anlamı |
|---|---|
if constexpr (cond) |
Derleme zamanı dal |
if (cond) |
Çalışma zamanı dal |
std::is_integral_v<T> |
Tür koşulu |
else return x |
Varsayılan dal |
3 if constexpr satırını tamamla
template <typename T>
auto twice(T x) {
____ (std::is_integral_v<T>) return x * 2;
return x;
}
template <typename T>
auto twice(T x) {
if constexpr (std::is_integral_v<T>) return x * 2;
return x;
}
Açıklama: if constexpr dalı derleme zamanında değerlendirir.