CodeBlanks Logo Icon CodeBlanks

Concepts

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

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

// twice şablonunu requires ile yaz

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

Örnek çözüm

main.cpp
#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

Soru
template <typename T> ____ std::integral<T> auto twice(T x) { return x * 2; }
Cevap
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.

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