Generalnie rzecz polega na przekazaniu funkcji do innej funkcji.
Trochę informatycznego języka:
Dla void visit( void (*pf)(Item &) ); wprowadzę A: void (*pf)(Item &) i B: void visit( A );
wtedy:
A jest pewnym wskaźnikiem na funkcje typu void z argumentem będącym referencją typu Item wtedy operacje wykonywane na Item zostają zachowane na rzecz modyfikowanego obiektu.
B wykonywane jest z argumentem A wtedy B może modyfikować za pomocą A każdy kolejny element będący w zasięgu B.
A teraz trochę przykładowego kodu do przeanalizowania:
#include <iostream>
using namespace std;
void visit( void (*pf)(char&), char *str, int size ){
int i;
for( i = 0; i < size; i++ ){
pf( str[i] );
}
}
void downCase( char &a ){
if( a >= 'A' && a <= 'Z' ){
a += 32;
}
}
void upperCase( char &a ){
if( a >= 'a' && a <= 'z' ){
a -= 32;
}
}
int main() {
char str[] = "WITAJ CPP";
int size = 9;
visit( downCase, str, size );
cout << str << endl;
visit( upperCase, str, size );
cout << str << endl;
return 0;
}
Oczywiście dla listy będzie wyglądało to zupełnie inaczej. Jak napiszesz kod to podeślij link na ideone wtedy zobaczymy czy jest ok.