en C ++, vous pouvez passer dans "Types de fonction", qui sont comme des pointeurs de fonction, mais ils ne sont que le type de fonction et non un pointeur. Par exemple: Quel est le nom propre de ce formulaire? Est-ce un "type de fonction"? P> J'ai édité mon exemple pour être un peu plus clair. Cependant, gardez à l'esprit la partie principale de l'échantillon que j'essaie de signaler est la partie Mise à jour: h2>
Void (int, int) code> partie. P> p>
3 Réponses :
Ils sont seulement comme des pointeurs de fonction en ce que la syntaxe est un peu similaire; Sinon, ils n'ont rien à voir avec les pointeurs de la fonction (c'est-à-dire qu'ils ne tiennent aucune donnée ni de telles choses). Cependant, David Rodriguez souligne ci-dessous qu'ils pourraient être considérés comme liés de la même manière que Quoi qu'il en soit, ils ne sont que des types cependant, comme int code> est lié à int * code>. P>.
int code> (pas un em> int code>, juste int code> int code> . p>
Je n'irais pas aussi loin que de dire qu'ils ne sont pas liés aux pointeurs de fonction: ils sont liés aux pointeurs de fonction de la même manière que int code> est lié à un point de point int * code> int * code> .
Oui, le terme est "Type de fonction". P>
Pas que je ne pense pas que ceci est un bon nom, mais ce n'est pas un type de fonction désignant à la fois le nom du type et sa définition? Peut-être que je suis trop nitpicky. (Je suis probablement trop malade).
@Michael: Pour être complètement nitpicky, void (int, int) code> est le spécificateur de type d'un type de fonction. Seuls les types définis par l'utilisateur (qui n'incluent pas les types de fonctions) ont des noms et des définitions.
Oui, il s'agit d'un "type de fonction" p>
8.3.5 [DCL.FCT] dit P>
- dans une déclaration td où d a la forme
d1 (paramètre-déclaration-clause) cv-qualificatif-seq code> opt em>Ref-Qualifier code> opt em>exception-spécification code> opt em>attribut-spécificateur-SEQ code> opt em> [... ] li>- dans une déclaration td où d a la forme
d1 (paramètre-déclaration-clause) cv-qualificatif-seq code> opt em>Ref-Qualifier code> opt em>exception-spécification code> opt em>attribut-spécificateur-SEQ code> opt em>Trailing -Return-Type Code> [...] Li>- Un type de formulaire est un type type em>. li> ol> blockQuote>
J'ai fait le commentaire à @Mike, et croyez-moi, c'est juste la curiosité maintenant, mais en 8.3.5, il parle à la fois du nom du type et de la définition complète. Le "type de fonction" de 8.3.5 ne serait pas une grammaire acceptable dans un paramètre de modèle.
@Michael Hays à droite, ce n'est pas acceptable comme paramètre de modèle, c'est là que Modèle 14.3 [temp.arg] / 2 code> a un bon exemple avec f
Que fait la classe? Si ce n'est qu'un type pour une fonction peut-être que vous pourriez appeler cela 'classe de fonction'? Parce que vous définissez une classe d'un type de fonction particulier. Je viens d'inventer de nouveaux mots ici: p
Quel est le nom propre pour un type b>? Que ce soit une fonction, un objet, une intégrale, un pointeur ou tout ce que je crois que c'est toujours i> a type b>.
Ug. Ne me frappe pas. Mais cela fonctionne réellement? Dans la norme, je vois que vous pouvez utiliser "typename". Cela semble être le seul choix grammatical, puisque "la classe" et "modèle" ne fonctionnent évidemment pas. Est-ce que void (int, int) juste fou longhand pour un nom de typage? Quel compilateur est-ce? Et encore ... N'hésitez pas à l'école moi. Je me rends compte que je n'ai jamais vu cela auparavant.
Oui, c'est fondamentalement une fonction. La plupart des gens tapéent quelque chose.
void (int, int) code> est un type de fonction qui prend deuxint code> s et renvoie unvoid code>. Il est beaucoup plus courant de voir:Typedef Void (& Func_vii) (int, int); MyTemplateclass {... code> @Michael:
void (int, int) code> est la spécification d'un type de fonction: le type d'une fonction qui prend deuxint code> des arguments et n'a aucune valeur de retour. Dans ce cas, il est utilisé comme argument sur un modèle avec un paramètre de type, déclaré probablement quelque part sous formeModèle Classe MyTemplateclass; code>. @Michael: Pour un exemple d'utilisation des types de fonctions, vous pouvez consulter
std :: fonction code> (ouboost.function code>).@ AJG85: Vous êtes beaucoup trop philosophique. Lors de la communication avec d'autres programmeurs, il est essentiel d'avoir une communication appropriée. Savoir quoi appeler ce type aidera à la fois la communication et la documentation. De plus, lorsque vous introduisez des contraintes de type (concepts), le désambiguement devient encore plus important.
@ROBERT: Peut-être, mais c'est une question philosophique. Vous pouvez appeler cela fargument i> tant que le terme et la définition sont acceptés par votre public. Les termes sont comme un argot que la seule chose qui compte est la signification est comprise par ceux qui l'utilisent.
@ AJG85: Ce n'est pas une question sur la philosophie, mais sur la terminologie. Si vous utilisez la terminologie de la norme linguistique, il n'est pas nécessaire de poser votre public à votre audience; Toute personne familiarisée avec la norme vous comprendra.
@Mike: Si j'avais un dollar pour chaque programmeur qui connaissait la norme, je serais pauvre. Tout ce que je voulais dire est le terme meilleur i> est subjectif.
@ AJG85. Je n'ai pas demandé le terme meilleur i>, j'ai demandé le terme adéquat i>. Je trouve à peine que subjectif, d'autant plus qu'une réponse décrit clairement les sections de la norme qui utilisent le terme "type de fonction".