9
votes

Quel est le terme approprié pour les pointeurs non-fonctions en C ++?

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: xxx

Quel est le nom propre de ce formulaire? Est-ce un "type de fonction"?

Mise à jour:

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 Void (int, int) partie.


11 commentaires

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 ? Que ce soit une fonction, un objet, une intégrale, un pointeur ou tout ce que je crois que c'est toujours a type .


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) est un type de fonction qui prend deux int s et renvoie un void . Il est beaucoup plus courant de voir: Typedef Void (& Func_vii) (int, int); MyTemplateclass {...


@Michael: void (int, int) est la spécification d'un type de fonction: le type d'une fonction qui prend deux int 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 forme Modèle Classe MyTemplateclass; .


@Michael: Pour un exemple d'utilisation des types de fonctions, vous pouvez consulter std :: fonction (ou boost.function ).


@ 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 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 est subjectif.


@ AJG85. Je n'ai pas demandé le terme meilleur , j'ai demandé le terme adéquat . 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".


3 Réponses :


1
votes

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 int est lié à int * . .

Quoi qu'il en soit, ils ne sont que des types cependant, comme int (pas un int , juste int int .


1 commentaires

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 est lié à un point de point int * int * .



6
votes

Oui, le terme est "Type de fonction".


2 commentaires

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) 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.



3
votes

Oui, il s'agit d'un "type de fonction"

8.3.5 [DCL.FCT] dit

  1. dans une déclaration td où d a la forme d1 (paramètre-déclaration-clause) cv-qualificatif-seq opt Ref-Qualifier opt exception-spécification opt attribut-spécificateur-SEQ opt [... ]
  2. dans une déclaration td où d a la forme d1 (paramètre-déclaration-clause) cv-qualificatif-seq opt Ref-Qualifier opt exception-spécification opt attribut-spécificateur-SEQ opt Trailing -Return-Type [...]
  3. Un type de formulaire est un type type .

2 commentaires

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 va. C'est acceptable comme argument de modèle. 14.3 [temp.arg] / 2 a un bon exemple avec f ();