Templates
Programarea generică în C++ se bazează pe ceea ce numim monomorfizare (monomorphization), un termen adoptat din comunitatea Rust.
Monomorfizarea este un procedeu simplu prin care clasele sau funcțiile generice, adică template-urile, sunt implementate la compile-time pentru fiecare parametrizare specifică prin substituirea literară a parametrilor template-ului cu tipurile și valorile date.
Monomorfizarea este una dintre cele trei posibile implementări ale genericității în limbajele de programare, celelalte fiind reificare și type erasure. Dezavantajul major al acestei implementări este că nu permite crearea de noi tipuri de date la runtime. Cu toate acestea, în comparație cu celelalte două, monomorfizarea are avantajul de a produce cod compilat mai bine optimizat și nu suferă de aceleași limitări.
În această secțiune, vom explora cum putem exprima concepte foarte abstracte cu ajutorul template-urilor din C++ și cum putem aplica restricții asupra acestora folosind concepts din C++20 ca predicate la compile-time.
📄️ Magma
Pentru a demonstra puterea de expresie a limbajului C++ vom lua un exemplu trivial din algebră, o magmă.
📄️ Functor
In acest exemplu vrem să ilustrăm o capabilitate a limbajului C++ folosind concepte, anume să implementăm conceptul din teoria categoriilor numit functor. Cel mai apropiat exemplu de implementare de funtori în programarea funcțională este cel din Haskell unde un functor este un tip de date care implementează o funcție $fmap$.