C ++ std_function

C ++ std_function

In C ++, STD significa standard. C ++ può avere una classe definita da cui sono istanziati gli oggetti. Una funzione definita normale, è come una classe. La chiamata di funzione è come un oggetto alla classe di funzione definita. Una chiamata di funzione, in momenti diversi, con argomenti diversi, è come oggetti di funzione diversi. Ora, C ++ ha classi di funzioni predefinite in cui possono essere istanziati diversi oggetti di funzione. È possibile utilizzare anche un oggetto funzione, come chiamata di funzione. Può essere un argomento della funzione di callback in un'altra chiamata di funzione. Un oggetto funzione può prendere il posto di un puntatore a una funzione normale.

La funzione std :: è una dichiarazione prototipo di funzione con il nome, funzione () nell'intestazione, della libreria. Ciò significa, per utilizzare la funzione std ::, l'intestazione o deve essere inclusa nel programma. La funzione std :: è anche un wrapper che prende un oggetto funzione come argomento, per produrre un altro oggetto funzione.

Questo articolo spiega C ++ Std :: Function, a cominciare da alcune classi di funzioni predefinite.

Contenuto dell'articolo

- Alcune classi di funzioni predefinite

- std :: trasforma

- std :: funzione corretta

- Conclusione

Alcune classi di funzioni predefinite

L'intestazione funzionale ha molti prototipi di classi di funzioni predefiniti, nelle categorie di Reference_Wrapper, operazioni aritmetiche, confronti, Class Confall_Three_way, Operazioni logiche, Operazioni Bitwise, Bind, Polimorfi Wrapper, ricercatori e modello di classe Hash.

Nella categoria aritmetica, due dei prototipi della classe di funzione sono:

modello Struttura nega;
E
modello struct plus;

Nota: una struttura è una specie di classe. Il primo negare i numeri in un elenco. Il secondo aggiungerebbe un numero corrispondente di due elenchi insieme, risultando in un elenco delle aggiunte.

std :: trasforma

C'è la funzione std :: trasform () nella libreria dell'algoritmo. Questa funzione prenderebbe l'inizio e la fine di un vettore e utilizzerebbe l'oggetto funzione negare per negare tutti gli elementi del vettore. L'oggetto funzione negate è l'ultimo argomento della chiamata funzione trasform (). Un prototipo (sintassi) è:

modello
Trasformazione dell'outputputterator di Costexpr (inputterator First1, inputPerator Last1,
Risultato di outputteratore, Unarie Operation OP);

dove l'outputteratore è un secondo vettore per i numeri negati risultanti. Viene inoltre restituito l'outputteratore.

Il seguente programma mostra l'uso della sintassi:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
vector vtr1 = 1, 2, 3, 4, 5;
vectorvtrout (5);
int main ()

trasformazione (VTR1.inizio (), vtr1.end (), vtrout.inizio (), negare ());
per (int i = 0; icout<cout<restituzione 0;

L'output è:

-1 -2 -3 -4 -5

Le direttive includono intestazioni iostream, algoritmo, funzionale e vettoriale. Viene utilizzato lo spazio dei nomi standard. I vettori di ingresso e output hanno le stesse dimensioni. La funzione std :: trasform () viene utilizzata senza, ritorno, poiché l'elemento di ritorno è un argomento della funzione di trasformazione. Il per loop stampica i numeri negati all'output. Un elemento di ritorno per la funzione di trasformazione sarebbe stato codificato come segue:

vtrout.inizio () = trasform (vtr1.inizio (), vtr1.end (), vtrout.inizio (), negare());

In una forma sovraccarica, la funzione trasform () prenderebbe l'inizio e la fine di un vettore. Quindi l'inizio di un altro vettore e utilizzare l'oggetto funzione A plus per aggiungere i numeri corrispondenti dei due vettori per avere un nuovo vettore con le somme. L'oggetto funzione più è l'ultimo argomento della chiamata di funzione di trasformata, a questo scopo. Il prototipo (sintassi) è:

modelloOutputputterator di classe, binaryoperation di classe>
Trasformata in uscita di CostexPR (inputterator1 First1, inputterator1 Last1,
Inputterator2 first2, risultato outputterator, binaryoperation binary_op);

dove outputterator è un terzo vettore per i numeri di somma risultante. Viene inoltre restituito l'outputteratore, ma questo non deve essere implementato. Vedi il seguente programma:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
vector vtr1 = 1, 2, 3, 4, 5;
vector vtr2 = 10, 20, 30, 40, 50;
vectorvtrout (5);
int main ()

trasformazione (VTR1.inizio (), vtr1.end (), vtr2.inizio (), vtrout.inizio (), più ());
per (int i = 0; icout<cout<restituzione 0;

L'output è:

11 22 33 44 55

Le direttive includono intestazioni iostream, algoritmo, funzionale e vettoriale. Viene utilizzato lo spazio dei nomi standard. I due vettori di input e uno di output hanno le stesse dimensioni. La funzione std :: trasform () viene utilizzata senza, ritorno, poiché l'elemento di ritorno è un argomento della funzione di trasformazione. Il per loop stampica i numeri sommati all'uscita.

std :: funzione corretta

Tutto quanto sopra ha spiegato come utilizzare un oggetto funzione, professionalmente. È possibile che il programmatore scriva la propria funzione come la funzione trasform () e usa il proprio oggetto funzione che ha scritto.

la funzione std :: non è un grosso problema. È un wrapper che prenderebbe qualsiasi oggetto di funzione come argomento. Questa sezione dell'articolo illustra come creare un oggetto di funzione semplice e che lo avvolge nella funzione std ::.

Un oggetto funzione è un oggetto richiamabile. Un oggetto richiamabile è qualsiasi oggetto che può essere usato come una funzione. Un esempio di classe di funzioni è mostrato nel seguente codice:

#includere
#includere
Utilizzo dello spazio dei nomi std;
struct structfn
int operator () (int a, int b)
int c = a + b;
ritorno c;

;
Structfnfn

Questa è la parte superiore del programma, priva solo della funzione principale C ++. Una struttura è come una classe. Questo codice ha la definizione di una struttura, chiamata structfn (equivalente al nome di classe). La struttura ha un solo membro, che è l'operatore tra parentesi. Un operatore è in qualche modo una funzione. Questa funzione prende due numeri interi come argomenti e restituisce un altro numero intero. In realtà restituisce la somma dei due numeri interi. La struttura, structfn è un tipo di oggetto funzione.

L'oggetto istanziato della struttura, structfn è FN. "Std :: function" stesso, è un altro tipo (classe). L'ultima affermazione nel codice sopra, istanzia un oggetto di std :: function (dove std :: è omesso perché è in "usare lo spazio dei nomi std;"). Il nome dell'oggetto standard per "std :: funzione", è f. "F ()" è un costruttore di oggetti. In questo caso, il suo unico argomento, è FN, che è un oggetto della classe di funzione, structfn. Quest'ultima affermazione avvolge l'oggetto funzione.

L'operatore (funzione) della classe funzione (struct) ha due argomenti di tipi int e int. Restituisce un altro int. Questa caratteristica di firma può essere rappresentata come: int (int, int). Ecco perché, la specializzazione del modello, della costruzione della funzione, è .

La sintassi per il costruttore di funzioni, usato sopra, è:

modello funzione di classe;

Il resto del programma, è la funzione C ++ main (). È:

int main ()

int z = f (2, 3);
cout << z << endl;
restituzione 0;

L'output è 5. F (2,3) è stato usato al posto di FN (2,3).

Il vantaggio della funzione std :: è che, può prendere qualsiasi oggetto di funzione, una volta che gli argomenti e il tipo di restituzione della funzione presi.

L'oggetto funzione sopra può essere modificato, da utilizzare come callback della funzione più, nella chiamata di funzione di trasformata.

Conclusione

La funzione std :: è dell'intestazione funzionale, che deve essere inclusa nel programma per essere utilizzata. Avvolge un oggetto funzione. L'oggetto funzione deve essere il suo argomento (della costruzione di funzioni std ::. Un oggetto funzione è un oggetto richiamabile. Un oggetto richiamabile è qualsiasi oggetto che può essere usato come una funzione. Il vantaggio della funzione std :: è che, può prendere qualsiasi funzione, una volta che gli argomenti e il tipo di ritorno, della funzione presi, sono noti.