Sobes.tech
Junior — Middle

Kuidas saab C++-s määrata piiranguid malliparameetritele?

sobes.tech AI

Vastus AI-lt

C++-is saab piiranguid tüüpidele mallparametrites määrata mitmel viisil:

  1. SFINAE (Substitution Failure Is Not An Error) — kasutades <type_traits>-st std::enable_if ja muid meta-funktsioone, saab mallfunktsioone või -klasse lisada või välja jätta sõltuvalt tüüpide omadustest.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Täisarvutüübid
}

int main() {
    foo(10);    // OK, int on täisarv
    // foo(3.14); // Kompileerimisviga, double ei sobi
}
  1. Käsitused (Concepts) — alates C++20 saab kasutada käsitusi, et määrata tüüpide piiranguid selgemalt ja deklaratiivsemalt.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Täisarvutüübid
}
  1. Staatilised kinnitused (static_assert) — mallide sees saab kontrollida tüüpide omadusi ja tekitada kompileerimisvea sõnumiga.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T peab olema täisarvuline tüüp");
    // ...
}

Sellised piirangud aitavad teha mallid turvalisemaks ja arusaadavamaks.