Impression d'un pointeur de fonction sans invocation
Lorsque vous essayez d'imprimer une fonction sans parenthèses (c'est-à-dire comme f au lieu de f()), on peut rencontrer des résultats inattendus comme toujours imprimer la valeur 1. Ce comportement apparemment paradoxal découle du mécanisme sous-jacent impliqué.
Dans le code fourni, l'instruction cout << pr; n'invoque pas réellement la fonction pr. Au lieu de cela, il passe le pointeur de fonction pr à cout. C interprète implicitement ce pointeur comme une valeur booléenne, avec un pointeur non nul évalué comme vrai et donc imprimé comme 1.
Pour imprimer le pointeur de fonction lui-même, il faut le convertir explicitement en un pointeur void* . Ceci peut être réalisé en utilisant des expressions telles que cout << (void*)pr.
C 11 et surcharge des pointeurs de fonction
Avec l'avènement de C 11, une méthode plus pratique pour imprimer des pointeurs de fonction est apparue. Surcharge du << L'opérateur pour les pointeurs de fonction permet une sortie plus informative. Par exemple, on peut définir une surcharge qui imprime l'adresse et l'arité de la fonction (nombre d'arguments) :
<code class="cpp">template <class RType, class ... ArgTypes> std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }
Cette surcharge imprimera la sortie au format (func_ptr=
) (num_args=< ;arity>).Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!