PDA

Visualizza la versione completa : [c++]Template


giuseppe500
02-02-2010, 16:08
mi sono rimesso a spulciare alcuni libri che avevo letto per consolidare .
ho questo codice tratto da thinking c++:



using namespace std;

template <typename T> void f(T*) {}
void h(void (*pf)(int*)) {}

template <class T>
void g(void (*pf)(T*)) {}
int _tmain(int argc, _TCHAR* argv[])
{
// Full type exposition:
h(&f<int>);
// Type induction:
h(&f);
// Full type exposition:
g<int>(&f<int>);
// Type inductions:
g(&f<int>);
g<int>(&f);

} ///:~

due domande:
1)void h(void (*pf)(int*)) {} dichiara un puntatore alla funzione f ?ma perchè questa sintassi , non riesco bene a comprendere.
2)se ho una classe template e devo dichiarare un puntatore a funzione membro non dovrei utilizzare la sintassi oggetto.*funzione?
faccio un po fatica a comprendere il meccanismo di quest esempio , chiedo a voi.
ciao.

grazie.

shodan
02-02-2010, 18:28
1) Beh, perchè a suo tempo Kernighan e Ritchie decisero così.
2) Li non c'è nessuna classe template, solo funzioni; quindi la sintassi oggetto::*puntatore_funzione_membro non si può applicare.

MacApp
03-02-2010, 01:07
Originariamente inviato da giuseppe500

1)void h(void (*pf)(int*)) {} dichiara un puntatore alla funzione f ?ma perchè questa sintassi , non riesco bene a comprendere.


scusa ma a me sembra che con:


void h(void (*pf)(int*)) {}

non venga dichiarato alcun puntatore alla funzione f, ma bensì venga definita la funzione h di tipo void che ha per argomento un puntatore a funzione (di tipo void che ha per argomento un puntatore a int).

Facciamo un prova giusto per conferma:


/*

Isidoro Ghezzi

$ g++ --version; g++ -ansi -pedantic -Wextra -Wconversion main.cpp; ./a.out
i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

The value is: 2010;

*/

#include <iostream>

void test (int * thePtr){
std::cout << "The value is: " << (*thePtr) << ";" << std::endl;
}

void h(void (*pf)(int*)){
int a = 2010;
pf (&a);
}

int main (void){
h (test);
return 0;
}

confermato ;-)

EDIT:
che è equivalente a (in modo più leggibile ricorrendo al typedef):


/*

Isidoro Ghezzi

$ g++ --version; g++ -ansi -pedantic -Wextra -Wconversion main.cpp; ./a.out
i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

The value is: 2010;

*/

#include <iostream>

void test (int * thePtr){
std::cout << "The value is: " << (*thePtr) << ";" << std::endl;
}

typedef void (*PointerToAFunctionWithAnIntegerPointerAsArg) (int * theIntegerPointer);

void h(PointerToAFunctionWithAnIntegerPointerAsArg pf){
int a = 2010;
pf (&a);
}

int main (void){
h (test);
return 0;
}

Loading