Inoltre vorrei chiedere, è qualcosa che non va (non raccomandato) cosa con l'utilizzo di puntatori a funzione dal momento che non ho mai visto nessuno usando loro.
Sì. I puntatori di funzione sono cose terribili, orribili. In primo luogo, non supportano l'essere generici, quindi non è possibile utilizzare un puntatore a funzione che, ad esempio, richiede std::vector<T>
per qualsiasi T
. In secondo luogo, non supportano lo stato legato, quindi se in qualsiasi momento, in futuro, nessuno vorrà fare riferimento ad un altro stato, saranno completamente fottuti. Questo è particolarmente grave poiché include this
per le funzioni membro.
Esistono due approcci per l'esecuzione di funzioni in C++ 11. Il primo è usare un modello. Il secondo è usare la funzione std ::.
Il modello si presenta un po 'come questo:
template<typename T> void func(F f) {
f();
}
I principali vantaggi qui sono che accetta qualsiasi tipo di oggetto di funzione, tra cui puntatore a funzione, lambda, funtore, legare-risultato, qualunque sia, e F può avere qualsiasi numero di sovraccarichi di chiamate di funzioni con qualsiasi firma, inclusi i modelli, e può avere qualsiasi dimensione con qualsiasi stato associato. Quindi è super-duper flessibile. È anche estremamente efficiente in quanto il compilatore può allineare l'operatore e passare lo stato direttamente nell'oggetto.
int main() {
int x = 5;
func([=] { std::cout << x; });
}
Lo svantaggio principale qui è soliti svantaggi di templates- non funziona per funzioni virtuali e deve essere definito nell'intestazione.
L'altro approccio è std::function
. std::function
ha molti degli stessi vantaggi - può essere di qualsiasi dimensione, legarsi a qualsiasi stato, ed essere qualsiasi cosa chiamabile, ma scambia una coppia.Principalmente, la firma è fissata all'ora di definizione del tipo, quindi non è possibile avere un per alcuni già noti T
, e potrebbe esserci anche qualche indiretta/allocazione dinamica coinvolta (se non è possibile SBO). Il vantaggio di questo è che poiché std::function
è un tipo concreto concreto, è possibile passarlo come con qualsiasi altro oggetto, in modo che possa essere utilizzato come parametro di funzione virtuale e tali cose.
Fondamentalmente, i puntatori di funzione sono solo incredibilmente limitati e non possono davvero fare qualcosa di interessante e rendere l'API incredibilmente flessibile. La loro abominevole sintassi è una piscia nell'oceano e ridurla con uno stampo alias è esilarante ma inutile.
possibile duplicato di [Devo usare std :: function o un puntatore di funzione in C++?] (Http://stackoverflow.com/questions/25848690/should-i-use-stdfunction-or-a-function-pointer -in-c) –
provate invece lambdas :) –
@AndrewLavq, ci sono alcune pesanti funzioni di stampa (non un'applicazione però, solo per scopi dimostrativi), che farebbe confusione con la leggibilità se sto usando lambdas. –