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>34template<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:
1template<Numeric T>2T topla(T a, T b) {3return a + b;4}56int main() {7std::cout << topla(5, 3) << std::endl; // 88std::cout << topla(2.5, 3.7) << std::endl; // 6.29// topla("a", "b"); // Hata: string Numeric değil10return 0;11}Çıktı:
1826.2Adı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};56struct Kisi {7std::string ad;8void print() { std::cout << ad << std::endl; }9};1011template<Printable T>12void yazdir(T obj) {13obj.print();14}1516int main() {17Kisi k{"Ali"};18yazdir(k); // Ali19return 0;20}Çıktı:
1AliNeden Ö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.
0 yorum