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 satisfaitAny
? Mais commeAny
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 satisfaitAny
.0 votes
Je voudrais que C ++ utilise son inférence de type habituelle, mais, si je passe un objet à
UsesAny::operator()
qui ne répond pas aux exigences du conceptAny
, je voudrais qu'il me dise au moment de la compilation que c'est une erreur.1 votes
Ensuite, il suffit simplement de le restreindre comme
UsesAny::operator()(Any auto)
.0 votes
Que veux-tu dire, sans plus d'effet?
UsesAnyB
semble bon.0 votes
@Barry Je reçois cette erreur de UsesAnyB :
un concept ne peut pas être contraint
0 votes
@ChrisJHarris Oh right, j'ai oublié cette règle. J'ai même répondu à cette question une fois.
0 votes
@Barry - votre réponse est en fait très utile - "Il est important que les concepts soient toujours des fonctions totales" - c'est une façon simple et agréable de le formuler.