Ci scusiamo per la doppia risposta, ma vedere il post originale rende molto più chiaro ciò che stai cercando, ed è un uso correlato ma piuttosto diverso dei puntatori di funzione. Quello che hai è un callback .
Supponiamo che desideri una funzione per scaricare un file da Internet. Quindi scrivi:
void DownloadFile(std::string URL, std::string discLocation);
Ora, è fantastico, fino a quando non provi a scaricare un file molto grande. All'improvviso DownloadFile
impiega molto tempo per terminare e non sai per quanto tempo sarà. Ragazzo, le cose sarebbero molto più semplici se tu avessi solo un indicatore di progresso di qualche tipo per farti sapere quanto sei lontano! Ma DownloadFile
non può tornare finché non è terminato, e non vuoi insegnare DownloadFile
in se stesso riguardo all'indicatore di progresso, perché ciò porterebbe ad un elevato accoppiamento e renderebbe più difficile riutilizzare DownloadFile
in un altro contesto.
Ciò che invece puoi fare è dargli un callback, un puntatore a funzione che DownloadFile
usa per chiamarti back dopo averlo chiamato. In effetti, probabilmente ne vorrai due:
void DownloadFile(std::string URL, std::string discLocation,
intFunction FileSize, intFunction FileProgress);
(dove intFunction
è un puntatore a funzione che prende un int come argomento). Chiamerebbe FileSize
una volta per impostare la dimensione del file e FileProgress
ripetutamente per informarti di quanto è lungo nel download. Con queste due informazioni disponibili, puoi collegare una barra di avanzamento o un altro tipo di indicatore di avanzamento, senza dover accoppiare DownloadFile
direttamente al controllo della barra di avanzamento.
Questo è il tipo di potere che i callback rendono disponibili. Li vedi molto nel codice che si occupa di eventi di lunga durata. Download, ad esempio, o codice per la riproduzione di suoni e musica. In un richiamo musicale, è possibile eseguire modifiche personalizzate al suono mentre viene riprodotto per aggiungere effetti o leggere il buffer audio e visualizzarne una rappresentazione su un equalizzatore.