Concepts
- C++ kursu
- İleri seviye
- Ders 4/83
- 5 dk
C++20 concepts ile şablon kısıtlarını öğrenirsin.
Concepts
Concepts (C++20), şablon parametrelerine konan tür kısıtlarıdır. template <typename T> requires std::integral<T> auto twice(T x) biçiminde yazılır. Kısıt sağlanmazsa derleyici net bir hata mesajı verir.
Concepts, eski SFINAE hata mesajlarının yerine okunaklı bir araç sunar. Standart kütüphane std::integral, std::floating_point, std::convertible_to gibi hazır concepts'ler içerir. Kısıt, gereksinim (requires) yan tümcesiyle ya da template <std::integral T> kısa yazımıyla verilir.
Kısıt sağlanmazsa
Bir concepts, derleme zamanında kontrol edilir. twice şablonu std::integral<T> kısıtını içeriyorsa, twice(std::string{...}) çağrısı derleme hatası verir. Hata mesajı 'string, integral gereksinimini sağlamıyor' der; karmaşık bir SFINAE yığını göstermez.
Concepts ayrıca requires (T a, T b) { a + b; } biçiminde ifade edilen ifade gereksinimlerini de destekler. Bu, T türünün + işlecini destekleyip desteklemediğini derleme zamanında sınar.
Uygulama Concepts ile twice şablonu
template <typename T> requires std::integral<T> auto twice(T x) şablonunu yaz ve gövdesi return x * 2; olsun. main içinde twice(6) çağır ve sonucu std::cout ile yazdır.
Başlangıç kodu
#include <iostream>
#include <concepts>
// twice şablonunu requires ile yaz
int main() {
// twice(6) çağır ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <concepts>
template <typename T>
requires std::integral<T>
auto twice(T x) {
return x * 2;
}
int main() {
std::cout << twice(6);
return 0;
}Beklenen çıktı
12
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Concept'i amacına eşle
| Kavram | Anlamı |
|---|---|
std::integral<T> |
Tamsayı kısıtı |
requires std::integral<T> |
Requires yan tümcesi |
template <std::integral T> |
Kısa yazım |
std::floating_point<T> |
Ondalık kısıtı |
2 Requires yan tümcesini tamamla
template <typename T> ____ std::integral<T> auto twice(T x) { return x * 2; }
template <typename T> requires std::integral<T> auto twice(T x) { return x * 2; }
Açıklama: requires, kısıt yan tümcesini başlatır.
3 Hangi satır concepts ile kısıtlı şablon değildir?
- template <std::integral T>
- template <typename T> requires std::integral<T>
- requires std::integral<T>
- template <typename T> Doğru cevap
Açıklama: Bu satırda hiçbir concepts kısıtı yok.