Voglio stampare un puntatore a funzione usando cout, e ho trovato che non ha funzionato. ma ha funzionato dopo che ho convertire il puntatore a funzione di (void *), in modo da non printf con% p, come ad esempioCome stampare i puntatori di funzione con cout?
#include <iostream>
using namespace std;
int foo() {return 0;}
int main()
{
int (*pf)();
pf = foo;
cout << "cout << pf is " << pf << endl;
cout << "cout << (void *)pf is " << (void *)pf << endl;
printf("printf(\"%%p\", pf) is %p\n", pf);
return 0;
}
ho compilato con g ++ ed ho ottenuto risultati come questo:
cout < < pf è 1
cout < < (void *) pf è 0x100000b0c
printf ("% p", pf) è 0x100000b0c
Quindi cosa fa cout con tipo int (*)()? Mi è stato detto che il puntatore della funzione è trattato come bool, è vero? E cosa fa il cout con type (void *)?
Grazie in anticipo.
MODIFICA: In ogni caso, possiamo osservare il contenuto di un puntatore di funzione convertendolo in (void *) e stamparlo usando cout. Ma non funziona per i puntatori di funzioni dei membri e il compilatore si lamenta della conversione illegale. So che i puntatori a funzioni dei membri sono piuttosto una struttura complicata diversa dai semplici puntatori, ma come possiamo osservare il contenuto di un puntatore di funzioni membro?
+1. L'unica conversione standard applicabile a un puntatore alla funzione è (salva la conversione da lvalue a rvalue) la conversione in 'bool'. In particolare, devi eseguire 'reinterpret_cast' per convertire' int (*)() 'in' void * '. – avakar
@avakar Esiste un documento che copre le regole di conversione dei puntatori di funzione? – ibread
Il documento finale sarebbe lo standard C++, sezioni 4 [conv] e 5.2 [expr.post]. Lo standard non è gratuito, ma puoi ottenere l'ultima bozza qui: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf. Fai attenzione che può essere difficile da leggere se non ci sei abituato. – avakar