CodeBlanks Logo Icon CodeBlanks

requires

requires clause ile şablon kısıtlarını öğrenirsin.

requires clause nedir?

requires anahtar sözcüğü iki biçimde karşımıza çıkar: requires clause (şablon kısıtı) ve requires expression (ifade denetimi). requires expression, bir takım ifadelerin geçerli olup olmadığına bakar ve bool döndürür.

Örnek: requires(T a, T b) { a + b; a - b; }. Bu ifade, a + b ve a - b geçerliyse true döndürür. Bir concept'in içinde ya da şablon kısıtı olarak kullanılır. Böylece türün hangi işlemleri desteklediği derleme zamanında sorgulanır.

requires clause kullanımı

Bir şablon fonksiyonu kısıtlamak için requires sözcüğünü şablon başlığının ardına yazarsın: template<typename T> requires Hashable<T> size_t hash_of(T v).

Böylece hash_of yalnızca Hashable koşulunu sağlayan türlerle çağrılabilir. Koşul sağlanmazsa derleyici kısa ve net bir hata verir. requires clause, concept adının yanında && ve || ile de birleştirilebilir: requires Hashable<T> && std::copyable<T>.

Uygulama Hashable concept'ini tanımla

Hashable concept'ini tanımla: requires(T a) { { std::hash<T>{}(a) } -> std::convertible_to<size_t>; } gövdesini kullansın. main içinde static_assert(Hashable<int>); ile sına ve std::cout ile "Hashable testi geçti" yaz.

Başlangıç kodu

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

// Hashable concept'ini buraya tanımla

int main() {
    // int için test et ve mesaj yaz
    return 0;
}

Örnek çözüm

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

template<typename T>
concept Hashable = requires(T a) {
    { std::hash<T>{}(a) } -> std::convertible_to<size_t>;
};

int main() {
    static_assert(Hashable<int>);
    std::cout << "Hashable testi geçti";
    return 0;
}

Beklenen çıktı

Hashable testi geçti

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 requires ifadesi

Soru
template<typename T> concept Hashable = ____(T a) { std::hash<T>{}(a); };
Cevap
template<typename T> concept Hashable = requires(T a) { std::hash<T>{}(a); };

Açıklama: requires ifadesi parametre listesi ve gövde ile yazılır.

2 requires(T a) { a.foo(); } neyi sınar?

  • a'nın bir sınıf olmasını
  • a'nın null olmamasını
  • a türünde foo() çağrısının geçerli olmasını Doğru cevap
  • a'nın foo() metodu döndürmesini

Açıklama: requires expression, a.foo() çağrısının derleme zamanında geçerli olup olmadığına bakar.

3 Parçayı rolüne eşle

Kavram Anlamı
requires(T a, T b) İfade denetimi
requires Hashable<T> Şablon kısıtı
a + b Denenen ifade
std::hash<T>{}(a) Hash çağrısı

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