12
votes

Passer un opérateur avec d'autres paramètres

J'ai un code très inefficace dans lequel de nombreuses lignes apparaissent 4 fois au fur et à mesure que je passe par des permutations avec des opérations "<" et ">" et une variété de variables et de constantes. Il semblerait qu'il existe un moyen d'écrire la fonction une fois et de passer dans les opérateurs avec les valeurs changeantes nécessairement et des variables "ref". Quelle technique dois-je apprendre? Les "délégués" ont été suggérons mais je ne vois pas comment les utiliser de cette manière. Ceci est en C # 2.0, VS2005, mais si la technique est générique et peut être utilisée avec C ++ aussi, ce serait génial.

Demande de code: Les suivants apparaissent dans de nombreuses guises, avec différents "<" et "> "Signes ainsi qu'un mélange de signes" + "et" - ": xxx


5 commentaires

Seriez-vous capable de poster du code?


Je suggérerais de publier un extrait de code sur http://refactoryycode.com/ . La plupart des soumissions reçoivent deux ou trois alternatives.


Quelqu'un pourrait-il formater ce code? Aussi, pourriez-vous nous donner un peu plus de code? En ce moment, il est difficile de voir ce que tout va varier - sera-t-il toujours contre Move [check] , et où ajust vient? Votre devinette actuelle à une méthode Signature peut aider.


Merci à Rob pour nettoyer la visibilité de ma cochet! "Ajuster" est une variable de classe et je le change en fonction de la résolution de l'écran et de l'ordinateur que je dépose le programme. Déplacer est une gamme d'instances d'une classe dans 2 des 4 variantes du code que je serais américain XPOS, pas de YPOS. Aussi 2 des 4 ont <, 2 ont>. Tout ce qui est avec> utiliserait A + avant la variable d'ajustement et vice versa. En outre, on utilise lcac_c.top, on utilise lcac_c.right, etc. Je voudrais que tous ceux-ci soient passés.


Merci, je vais regarder sur ce site!


3 Réponses :


2
votes

en C # Utilisez des délégués pour passer le " << / code>" et "> " opération sur le code qui effectue le travail.

C # Exemple: xxx

Vous devez également vérifier que le délégué que vous obtenez en tant que paramètre n'est pas null.

C'est la méthode C pour le faire: xxx


1 commentaires

Idiomatic C ++ utiliserait effectivement des objets de fonction et non des pointeurs de fonction (en particulier, cela permettrait d'utiliser std: moins et d'autres foncteurs de ces actions).



14
votes

en C ++, utilisez le std :: moins code > et std :: plus grand code> foncteurs. Ces deux méthodes hériter std :: binaire_function code> A>, votre fonction générique devrait donc accepter des instances de ce type.

in .NET, l'équivalent à std :: binaire_function code> est FUNC code> . Il n'y a pas d'équivalents à std :: moins code> et std :: plus grand code>, mais il est assez trivial de les créer. Voir l'exemple suivant. P> xxx pré>

Remarque, le code ci-dessus utilise la classe Func Code> de .NET 3.5. Si cela n'est pas acceptable, envisagez de définir votre propre délégué. P>

C ++ Invocation Exemple: P>

void DoWork(Func<int, int, bool> myOperator, int arg1, int arg2)
{
    if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}

void main()
{
    DoWork(Functor.Less<int>(), 100, 200);
    DoWork(Functor.Greater<int>(), 100, 200);
}


3 commentaires

C'est une bonne réponse que la mienne.


Dans l'exemple C # ci-dessus, le fonctionnement est disponible dans .NET 2.0? Je ne peux pas faire fonctionner le code ci-dessus? Dois-je ajouter une référence?


Non, le fonctionnement n'est pas une classe standard .NET - vous devez l'écrire vous-même. De plus, .NET 2.0 ne contient pas de Func <> (il est dans System.core.dll in .NET 3.5), vous devrez donc utiliser System.Predicate à sa place.



2
votes

Après avoir défini l'opérateur ENUM dans la classe de comparaison

 if (IsTrue(var1, Operator.GreaterThanOrEqual,  var2))
    Console.WriteLine("var1 is greater than var2");
 else
    Console
        .WriteLine("Unfortunately var1 is not greater than or equal var2. Sorry about that.");


1 commentaires

Veuillez envisager d'ajouter des détails et des explications pour soutenir votre réponse afin d'aider les autres