is_integral
- C++ kursu
- İleri seviye
- Ders 14/83
- 5 dk
is_integral ve is_floating_point ile tür sınıflandırma öğrenirsin.
is_integral / is_floating_point
std::is_integral_v<T>, T tamsayı türü mü diye sorar. int, char, long, bool için true; double, std::string için false verir. std::is_floating_point_v<T> ise float, double için true verir.
Bu iki trait, sayısal türleri sınıflandırmak için kullanılır. Bir şablon, türüne göre farklı kod çalıştırmak istiyorsa önce trait ile sınıfı belirler, sonra if constexpr ile dallanır. Bu, gereksiz aşırı yükleme yazmaktan daha kısadır.
if constexpr ile kullanım
Bir trait sonucu if constexpr koşulu olarak verilirse, derleyici yalnızca uygun dalı derler. Örnek: if constexpr (std::is_integral_v<T>) return x + 1; else return x; Tamsayılar için x + 1 döner; std::string için bu dal derlenmez.
Bu yöntem, gereksiz aşırı yükleme yazmamak için kullanışlıdır. Tek şablon, birden fazla türü destekler; her tür için yalnızca ilgili dal derlenir. Trait + if constexpr, modern C++'ın temel bir kalıbıdır.
Uygulama classify şablonunu yaz
template <typename T> const char* classify() yaz. Gövdede if constexpr (std::is_integral_v<T>) return "int"; else return "other"; olsun. main içinde std::cout << classify<int>(); yaz.
Başlangıç kodu
#include <iostream>
#include <type_traits>
// classify şablonunu yaz
int main() {
// classify<int>() çağır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <type_traits>
template <typename T>
const char* classify() {
if constexpr (std::is_integral_v<T>) return "int";
else return "other";
}
int main() {
std::cout << classify<int>();
return 0;
}Beklenen çıktı
int
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Ondalık trait'ini tamamla
template <typename T>
constexpr bool is_num = std::is_integral_v<T> || std::____<T>;
template <typename T>
constexpr bool is_num = std::is_integral_v<T> || std::is_floating_point_v<T>;
Açıklama: is_floating_point_v<T> ondalık türleri tanır.
2 is_integral_v<std::string> ne döndürür?
std::is_integral_v<std::string>- true
- false Doğru cevap
- Derleme hatası
- std::string
Açıklama: std::string tamsayı türü değildir; sonuç false olur.
3 Türünü trait'ine eşle
| Kavram | Anlamı |
|---|---|
is_integral_v<int> |
true (tamsayı) |
is_floating_point_v<int> |
false (tamsayı değil) |
is_integral_v<double> |
false (ondalık değil) |
is_floating_point_v<double> |
true (ondalık) |