requires
- C++ kursu
- İleri seviye
- Ders 62/83
- 5 dk
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
#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
#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
template<typename T> concept Hashable = ____(T a) { std::hash<T>{}(a); };
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ı |