12
votes

Comment pouvons-nous appeler une fonction avec "paramètre = valeur" en C ++?

Lorsque vous lisez des codes, nous trouverons des fonctions comme celle-ci. XXX

Je pense que personne ne peut comprendre quelle est la signification de chaque paramètre. Pour comprendre le code, nous devons trouver la déclaration de la fonction. xxx

Comment pouvez-nous appeler une fonction comme le format suivant en C ++? < Pré> xxx

Je pense que celui-ci sera plus lisible et je peux comprendre le code sans chercher la déclaration de la fonction.

Je sais que Python peut faire cela. Comment C ++ peut-il faire cela?


2 commentaires

@Santhoshpai je suis en désaccord avec vous. Le deuxième appel ne dépassant que si les variables sont déclarées avant l'appel de la fonction et ce n'est pas ce que l'OP demande


Si vous faites GLOBALS « inutilisés » par ces noms, Votre compiles de code tel quel < / a>. Je ne pense pas que ce soit une bonne idée, surtout pour C ++.


6 Réponses :


5
votes

Ceci n'est pas possible en C ou C ++.

Je comprends vos douleurs avec cela. Personnellement, je pense que c'est un signe de mauvaise conception pour avoir une fonction prendre plus de 9 000 arguments, en particulier si la plupart d'entre eux sont null ou valeurs d'espace réservé. De nombreuses fonctions standardisées POSIX, par exemple, prenez une sorte de struct qui accumule toutes les valeurs nécessaires dans un argument facile à comprendre.


3 commentaires

Il est possible en C ++, mais le mécanisme sous-jacent pourrait ne pas être joli. Vous pouvez déclarer la fonction à appeler avec tous les paramètres de classe FOO. La classe FOO contiendrait une union de tous les types de paramètres possibles et un énorme pour les paramètres. Alors working_directory , enfant_setup , et cetera pourrait être des objets globaux de classes avec définitions de opérateur = , de sorte que working_directory = null Évalué à quelque chose qui a enregistré le NULL dans l'Union et définissez l'ENum à la valeur du paramètre working_Directory . Ensuite, la fonction appelée doit décoder les paramètres qui lui sont transmis.


@ERICPOSTPISCHIL: Tandis que cela fonctionnera certainement, il est encore plus moche et érigé d'erreur qu'une tonne de paramètres sur une fonction.


C'est parfaitement possible en C ++, et pas même particulièrement difficile, conceptuellement. (Cela prend beaucoup de code supplémentaire.) D'autre part, je suis certainement d'accord avec vous que c'est une mauvaise conception d'avoir une fonction prendre plus de 9 000 paramètres, mais une sorte d'aide pourrait être utile même pour des fonctions qui prennent un beaucoup moins. Je n'ai jamais vu une fonction avec 9 000 paramètres, mais j'ai dû faire face à certains dans un code hérité avec 40 ou 50 paramètres.



4
votes

Non, cela ne peut pas être fait. Mais vous pouvez affecter les valeurs null code> aux variables, puis les transmettre en tant que paramètres si cela aide à votre lisibilité!

g_spawn_async(working_directory, argv, envp,flags,child_setup , user_data, child_pid, error);


2 commentaires

Mais cela devra définir des variables supplémentaires et sera moins efficace sans l'optimisation du compilateur.


@Yuanhang: Heureusement, les compilateurs font ont une optimisation! Hourra!




1
votes

C'est certainement possible. Ce n'est même pas particulièrement difficile, Mais cela implique beaucoup de code. Quelque chose comme ce qui suit pourrait être utilisé: xxx

notes:

  1. J'ai utilisé c ++ 11 ici. La même chose peut être faite dans plus tôt versions de C ++, en remplaçant le type C dans le Union avec Unsigné Char c [Tailleof (C)]; , ajoutant quelque chose au Union pour assurer un alignement correct (si nécessaire) et beaucoup de type Casting.

  2. Ce serait beaucoup plus simple avec boost :: variante (au lieu de Le Union ) et boost :: facultatif (dans myfunCaramgroup ). Je n'avais pas de boost disponible, alors j'ai fait la plupart de ce qu'ils font explicitement. (Qui bien sûr, rend le code beaucoup plus longtemps.)

  3. J'ai intentionnellement utilisé deux paramètres avec le même type, et un type défini par l'utilisateur ( C ) avec des constructeurs non triviaux, pour montrer comment ceux-ci sont manipulés.

  4. Vous voudrez probablement un peu plus d'encapsulation, et un peu plus vérification des erreurs.

    Mais la vraie question est la suivante: voulez-vous vraiment y aller? La quantité de code augmente linéairement avec le nombre de paramètres. Et avec n'importe quel éditeur décent, vous pouvez mettre temporairement la liste des paramètres de la déclaration de fonction à droite de votre écran et remplissez les paramètres à gauche, directement sur le côté de la déclaration de paramètre. (À Gvim, je vais habituellement Utilisez le mode d'édition de bloc pour cela, mais : vsplit peut aussi être utilisé.)


0 commentaires


1
votes

Les paramètres nommés sont très utiles et j'avais même envisagé que dans une langue, ils devraient être le seul moyen d'appeler une fonction, à l'exception d'un seul paramètre évident s'il est présent.

sin(x)               // the obvious main parameter
sin(x, unit=DEGREE)  // any other must be named


0 commentaires