Lorsque vous lisez des codes, nous trouverons des fonctions comme celle-ci. 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. P> Comment pouvez-nous appeler une fonction comme le format suivant en C ++? P> < Pré> xxx pré> Je pense que celui-ci sera plus lisible et je peux comprendre le code sans chercher la déclaration de la fonction. P> Je sais que Python peut faire cela. Comment C ++ peut-il faire cela? P> p>
6 Réponses :
Ceci n'est pas possible en C ou C ++. P>
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 code> ou valeurs d'espace réservé. De nombreuses fonctions standardisées POSIX, par exemple, prenez une sorte de
struct code> qui accumule toutes les valeurs nécessaires dans un argument facile à comprendre. P>
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 code>,
enfant_setup code>, et cetera pourrait être des objets globaux de classes avec définitions de
opérateur = code>, de sorte que
working_directory = null Code> Évalué à quelque chose qui a enregistré le NULL dans l'Union et définissez l'ENum à la valeur du paramètre
working_Directory code>. 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.
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);
Mais cela devra définir des variables supplémentaires et sera moins efficace sans l'optimisation du compilateur.
@Yuanhang: Heureusement, les compilateurs font i> ont une optimisation! Hourra!
C ++ ne prend pas en charge cette natalement, vous ne pouvez donc pas le faire avec une seule fonction existante. Si vous créez votre propre API, vous pouvez utiliser ce qu'on appelle le Nommé Paramètre Idiom A > l'imiter. L'exemple de la liaison:
Vous pouvez également envelopper l'API existante avec quelque chose de similaire à celui-ci.
Cela semble mieux, mais cela entraînera des méthodes plus publiques, qui détruit l'encapsulation.
@Yuanhang: Non, cela n'entraîne pas plus de méthodes publiques. Regardez à nouveau, les méthodes sont sur l'objet code> openfile code>, où il crée un objet (code> objet. L'objet code> code> n'a aucune méthode publique supplémentaire, autre qu'un nouveau constructeur de conversion.
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é: notes: p> 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 Ce serait beaucoup plus simple avec J'ai intentionnellement utilisé deux paramètres avec le même type,
et un type défini par l'utilisateur ( Vous voudrez probablement un peu plus d'encapsulation, et un peu plus
vérification des erreurs. P> li>
ol> 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
C code> dans le
Union code> avec
Unsigné Char c [Tailleof (C)]; Code>, ajoutant quelque chose au
Union code>
pour assurer un alignement correct (si nécessaire) et beaucoup de type
Casting. P> Li>
boost :: variante code> (au lieu de
Le
Union code>) et
boost :: facultatif code> (dans
myfunCaramgroup code>).
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.) P> li>
C code>) avec des constructeurs non triviaux,
pour montrer comment ceux-ci sont manipulés. p> li>
: vsplit code> peut aussi être
utilisé.) p> p>
La bibliothèque de paramètres de boost peut vous aider. Cela fonctionne bien et est portable .... Voir http://www.boost.org/ doc / libs / 1_54_0 / libs / paramètre / doc / html / index.html p>
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
@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 ++.