Outils pour utilisateurs

Outils du site


lang:cpp:concept

Ceci est une ancienne révision du document !


Les concepts servent à forcer des classes à respecter certaines contraintes ou à définir des interfaces.

https://omnigoat.github.io/2020/01/19/cpp20-concepts/ Archive du 19/01/2020 le 05/02/2020

Définitions des concepts

  • Contrainte sur un type :
template <typename T>
concept integral = std::is_integral_v<T>;
  • Contrainte sur les fonctions :
template <typename T>
// Le type est cv. Donc, il faut utiliser deux paramètres, l'un pour const, l'autre sans.
concept Shape = requires(const T t, T u)
{
  // Le type de retour est faculatif mais conseillé.
  { t.area() } -> float;
  { u.mod() } -> float;
  // On impose une variable. Elle peut être static / constexpr ou non.
  { t.varr } -> float;
};

Application des concepts

  • Vérification qu'une structure respecte un concept
struct Rectangle
{
    consteval float area() const {return 1.;}
    consteval float mod() {return 1.;}
    static constexpr float varr = 2.f;
};
static_assert(Shape<Rectangle>);
  • Forcer un template à respecter un concept
template <class T>
requires Shape<T>
class AllFormes
{
 
};
  • Cast d'un type vers un concept
int main()
{
  Rectangle a;
  Shape auto &b = a;
  b.mod();
}
lang/cpp/concept.1581336555.txt.gz · Dernière modification : 2020/02/10 13:09 de root