C++ 20 Concepts: Template Parametrelerini Kısıtlama

C++ 20 öncesinde template yazarken, derleyici kodu instantiate ettiği anda hata verirdi. Concepts bu sorunu baştan çözer: template parametrelerine koşul koyarak, yalnızca uygun tipler kabul edilmesini sağlar.

Consept, bir template parametresinin hangi özellikleri taşıması gerektiğini tanımlayan bir kısıtlamadır. Mesela bir fonksiyonun sadece toplama işlemi yapabilen tipler için çalışmasını istersen, bunu concept ile belirtirsin.

Adım 1: Basit Bir Concept Tanımla

Bir template parametresinin sayısal olması gerektiğini şöyle belirtirsin:

1#include <iostream>
2#include <concepts>
3
4template<typename T>
5concept Numeric = std::integral<T> || std::floating_point<T>;

Burada std::integral ve std::floating_point C++ kütüphanesinin hazır conceptleri. Numeric concept, T'nin tam sayı veya ondalık sayı olması gerektiğini söyler.

Adım 2: Concept'i Template'de Kullan

Şimdi bu koşulu bir fonksiyona uygula:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1template<Numeric T>
2T topla(T a, T b) {
3return a + b;
4}
5
6int main() {
7std::cout << topla(5, 3) << std::endl; // 8
8std::cout << topla(2.5, 3.7) << std::endl; // 6.2
9// topla("a", "b"); // Hata: string Numeric değil
10return 0;
11}

Çıktı:

18
26.2

Adım 3: Özel Concept Yazma

Kendi koşullarını da tanımlayabilirsin. Örneğin, bir tipe print() metodu olması gerektiğini istersen:

1template<typename T>
2concept Printable = requires(T t) {
3{ t.print() } -> std::convertible_to<void>;
4};
5
6struct Kisi {
7std::string ad;
8void print() { std::cout << ad << std::endl; }
9};
10
11template<Printable T>
12void yazdir(T obj) {
13obj.print();
14}
15
16int main() {
17Kisi k{"Ali"};
18yazdir(k); // Ali
19return 0;
20}

Çıktı:

1Ali

Neden Önemli?

Conceptler olmadan, yanlış tip geçersen derleyici uzun, anlaşılmaz bir hata mesajı verir. Concepts ile hata mesajı açık olur: "Bu tip Numeric concept'ini karşılamıyor." Kodun okunabilirliği artar ve tip hatalarını erken yakala.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz