2 votes

Utiliser un concept dans la clause 'requires' d'un autre concept

J'ai un exemple assez simple avec lequel je lutte. Je voudrais utiliser un concept déjà défini dans la clause requires d'un autre concept - quelque chose comme ceci, sauf que ça fonctionne réellement :

template
concept Any = true;

template
concept UsesAnyA = requires(T t, Any auto a) {
  t(a);
};

J'ai aussi essayé de définir UsesAny de cette manière, mais sans plus de succès :

template
concept UsesAnyB = requires(T t, A a) {
  t(a);
};

D'un point de vue conceptuel, ça devrait être possible. Quelqu'un peut-il suggérer quelque chose ?

0 votes

" D'un point de vue conceptuel (...désolé) on a l'impression que cela devrait être possible. Malheureusement, ce n'est pas possible. Comment le compilateur peut-il générer tous les types qui satisfont Any ?"

0 votes

@ - le premier concept (Any) que je viens de définir aussi simplement que possible, dans le cadre de cet exemple. Dans la vie réelle, il est plus précis que cela.

0 votes

Si je comprends bien, vous voulez utiliser le concept pour détecter si le type T peut accepter n'importe quel paramètre qui satisfait Any? Mais comme Any n'est pas un type, si vous ne passez pas un type spécifique à T, le compilateur ne vous aidera pas à générer un type qui satisfait Any.

4voto

Patrick Roberts Points 405

Probablement besoin de faire quelque chose comme cela :

template 
concept Any = true;

template 
concept UsesAny = Any and requires (T t, A a) {
  t(a);
};

Un concept a besoin de chacun des types complets impliqués pour tester sa contrainte, mais au moment où vous l'évaluez, vous devriez déjà avoir les types complets disponibles pour tester.

Je réalise que vérifier Any dans cet exemple est redondant, mais je suppose que votre concept réel n'est pas trivial, et cela montre comment l'utiliser pour contraindre votre concept dépendant.

Voici les trois façons différentes de contraindre un modèle avec UsesAny :

template auto f(A a, UsesAny `auto t) { t(a); }

template T> auto f(A a, T t) { t(a); }

template requires UsesAny auto f(A a, T t) { t(a); }`

chacune de ces formes sont équivalentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X