Voici ma solution en utilisant un modèle varadic. Les performances d'exécution sont aussi efficaces que d'écrire manuellement x != 3 && x != 8 && x != 87 && x != 9
.
template
bool not_equal(const T& t, const U& u) {
return t != u;
}
template
bool not_equal(const T& t, const U& u, const Vs&... vs) {
return t != u && not_equal(t, vs...);
}
int main() {
std::cout << not_equal( 3, 3, 8, 87, 9) << std::endl;
std::cout << not_equal( 8, 3, 8, 87, 9) << std::endl;
std::cout << not_equal(87, 3, 8, 87, 9) << std::endl;
std::cout << not_equal( 9, 3, 8, 87, 9) << std::endl;
std::cout << not_equal(10, 3, 8, 87, 9) << std::endl;
}
Depuis C++17, l'implémentation peut être simplifiée en utilisant des expressions fold:
template
bool not_equal(const T& t, const Vs&... vs) {
return ((t != vs) && ...);
}
0 votes
Est-ce qu'il y a un motif mathématique entre les nombres que vous voulez tester? (Je n'en vois pas un pour l'exemple de 3,8,87,9)
1 votes
@Superlokkus, je ne pense pas, comme l'a mentionné l'auteur du sujet dans l'un des commentaires ci-dessous.
8 votes
if (((x - 3) * (x - 8) * (x - 87) * (x - 9)) != 0)
devrait utiliser moins de conditions, mais peut échouer en cas de débordement.6 votes
@Jarod42 De plus, ces multiplications pourraient, autant que je sache, être plus coûteuses que les simples tests d'égalité.
2 votes
Généralement, ces nombres aléatoires peuvent être décrits en mots ("longueurs invalides", "super premiers", etc), donc vous pouvez et devez extraire la vérification dans une fonction nommée
isValidLength
(ou autre), rendant la condition à la fois plus courte et plus facile à lire. Et si les nombres n'ont pas de relation, ce sont des nombres magiques et devraient être des constantes.2 votes
Lié: Meilleure façon de dire
x == Foo::A || x == Foo::B || x == Foo::C ||
en particulier dans le cas oùx
est d'un type difficile à écrire.0 votes
Je ne vois rien de mal avec ça si tu le fais une fois. Sinon, déclarez une fonction booléenne et réutilisez-la pour comparer une valeur x.
0 votes
Est-ce que le court-circuit fonctionne si vous inversez != à == et && à || et utilisez else?