Ìíîãèå aëãîðèòìû íå çaâèñяò îò òèïîâ äaííûõ, ñ êîòîðûìè îíè ðaáîòaþò (êëañ- ñè÷åñêèé ïðèìåð — ñîðòèðîâêa). Åñòåñòâåííî æåëaíèå ïaðaìåòðèçîâaòü aëãî- ðèòì òaêèì îáðaçîì, ÷òîáû åãî ìîæíî áûëî èñïîëüçîâaòü äëя ðaçëè÷íûõ òèïîâ äaííûõ. Ïåðâîå, ÷òî ìîæåò ïðèéòè â ãîëîâó — ïåðåäaòü èíôîðìaöèþ î òèïå â êa-
÷åñòâå ïaðaìåòða (íaïðèìåð, îäíèì ïaðaìåòðîì â ôóíêöèþ ïåðåäaåòñя óêaçaòåëü ía äaííûå, a äðóãèì — äëèía ýëåìåíòa äaííûõ â áaéòaõ). Èñïîëüçîâaíèå äîïîë- íèòåëüíîãî ïaðaìåòða îçía÷aåò ãåíåðaöèþ äîïîëíèòåëüíîãî êîäa, ÷òî ñíèæaåò ýôôåêòèâíîñòü ïðîãðaììû, îñîáåííî ïðè ðåêóðñèâíûõ âûçîâaõ è âûçîâaõ âî âíóòðåííèõ öèêëaõ; êðîìå òîãî, îòñóòñòâóåò âîçìîæíîñòü êîíòðîëя òèïîâ. Äðó- ãèì ðåøåíèåì áóäåò íaïèñaíèå äëя ðaáîòû ñ ðaçëè÷íûìè òèïaìè äaííûõ íå- ñêîëüêèõ ïåðåãðóæåííûõ ôóíêöèé, íî â òaêîì ñëó÷aå â ïðîãðaììå áóäåò íå- ñêîëüêî îäèíaêîâûõ ïî ëîãèêå ôóíêöèé, è äëя êaæäîãî íîâîãî òèïa ïðèäåòñя ââîäèòü íîâóþ.
 C++ åñòü ìîùíîå ñðåäñòâî ïaðaìåòðèçaöèè — øaáëîíû. Cóùåñòâóþò øaáëîíû ôóíêöèé è øaáëîíû êëaññîâ (î øaáëîíaõ êëaññîâ ñì. ñ. 211). C ïîìîùüþ øaáëî- ía ôóíêöèè ìîæíî îïðåäåëèòü aëãîðèòì, êîòîðûé áóäåò ïðèìåíяòüñя ê äaííûì ðaçëè÷íûõ òèïîâ, a êîíêðåòíûé òèï äaííûõ ïåðåäaåòñя ôóíêöèè â âèäå ïaðaìåò- ða ía ýòaïå êîìïèëяöèè. Êîìïèëяòîð aâòîìaòè÷åñêè ãåíåðèðóåò ïðaâèëüíûé êîä, ñîîòâåòñòâóþùèé ïåðåäaííîìó òèïó. Òaêèì îáðaçîì, ñîçäaåòñя ôóíêöèя, êîòîðaя aâòîìaòè÷åñêè ïåðåãðóæaåò ñaìa ñåáя è ïðè ýòîì íå ñîäåðæèò íaêëaä- íûõ ðañõîäîâ, ñâяçaííûõ ñ ïaðaìåòðèçaöèåé.
Ôîðìaò ïðîñòåñøåñ ôóínöèè-øaáëîía:
template Type> çaãîëîâîê{
/* òåëî ôóíêöèè */
}
Âìåñòî ñëîâa Type ìîæåò èñïîëüçîâaòüñя ïðîèçâîëüíîå èìя.
 îáùåì ñëó÷aå øaáëîí ôóíêöèè ìîæåò ñîäåðæaòü íåñêîëüêî ïaðaìåòðîâ, êaæ- äûé èç êîòîðûõ ìîæåò áûòü íå òîëüêî òèïîì, íî è ïðîñòî ïåðåìåííîé, íaïðè- ìåð:
template vOid f(){ ... }
Íaïðèìåð, ôóíêöèя, ñîðòèðóþùaя ìåòîäîì âûáîða (îí áûë ðaññìîòðåí ía ñ. 59) ìaññèâ èç n ýëåìåíòîâ ëþáîãî òèïa, â âèäå øaáëîía ìîæåò âûãëяäåòü òaê:
template
vOid sOrt_vybOr(Type *b, int n){
Type a; //áóôåðíaя ïåðåìåííaя äëя îáìåía ýëåìåíòîâ fOr (inti= 0; iint imin = i;
fOr (intj=i+ 1; jif (b[j] < b[imin]) imin = j;
a = b[i]; b[i] = b[imin]; b[imin] = a;
}
}
Ãëaâíaя ôóíêöèя ïðîãðaììû, âûçûâaþùåé ýòó ôóíêöèþ-øaáëîí, ìîæåò èìåòü âèä:
inClude
template vOid sOrt_vybOr(Type *b, int n); int main(){
COnst intn= 20; int i, b[n];
fOr (i = 0; i> b[i];
sOrt_vybOr(b, n); // Cîðòèðîâêa öåëî÷èñëåííîãî ìaññèâa fOr (i = 0; iCOut << endl;
dOuble a[] = {0.22, 117, -0.08, 0.21, 42.5};
sOrt_vybOr(a, 5); // Cîðòèðîâêa ìaññèâa âåùåñòâåííûõ ÷èñåë fOr (i = 0; i<5; i++) COut << a[i] << ' ';
return 0;
}
Ïåðâûé æå âûçîâ ôóíêöèè, êîòîðûé èñïîëüçóåò êîíêðåòíûé òèï äaííûõ, ïðèâî- äèò ê ñîçäaíèþ êîìïèëяòîðîì êîäa äëя ñîîòâåòñòâóþùåé âåðñèè ôóíêöèè. Ýòîò ïðîöåññ íaçûâaåòñя èíñòaíöèðîâaíèåì øaáëîía (instantiation). Êîíêðåòíûé òèï äëя èíñòaíöèðîâaíèя ëèáî îïðåäåëяåòñя êîìïèëяòîðîì aâòîìaòè÷åñêè, èñõîäя èç òèïîâ ïaðaìåòðîâ ïðè âûçîâå ôóíêöèè, ëèáî çaäaåòñя яâíûì îáðaçîì. Ïðè ïîâòîðíîì âûçîâå ñ òåì æå òèïîì äaííûõ êîä çaíîâî íå ãåíåðèðóåòñя. Ía ìåñòå ïaðaìåòða øaáëîía, яâëяþùåãîñя íå òèïîì, a ïåðåìåííîé, äîëæíî óêaçûâaòüñя êîíñòaíòíîå âûðaæåíèå1.
Ïðèìåð яâíîãî çaäaíèя aðãóìåíòîâ øaáëîía ïðè âûçîâå:
template vOid f(Y, Z); vOid g(){
f("Vasia", 3.0);
f("Vasia", 3.0); // Z îïðåäåëяåòñя êaê dOuble f("Vasia", 3.0); // Y îïðåäåëяåòñя êaê Char*,aZ— êaê dOuble
// f("Vasia", 3.0); îøèáêa: X îïðåäåëèòü íåâîçìîæíî
}
×òîáû ïðèìåíèòü ôóíêöèþ-øaáëîí ê òèïó äaííûõ, îïðåäåëåííîìó ïîëüçîâaòå- ëåì (ñòðóêòóðå èëè êëaññó), òðåáóåòñя ïåðåãðóçèòü îïåðaöèè äëя ýòîãî òèïa äaí- íûõ, èñïîëüçóåìûå â ôóíêöèè (î ïåðåãðóçêå îïåðaöèé ñì. ñ. 189).
Êaê è îáû÷íûå ôóíêöèè, øaáëîíû ôóíêöèé ìîãóò áûòü ïåðåãðóæåíû nan ñ ïîìî- ùüþ øaáëîíîâ, òan è îáû÷íûìè ôóínöèяìè.
Ìîæíî ïðåäóñìîòðåòü ñïåöèaëüíóþ îáðaáîòêó îòäåëüíûõ ïaðaìåòðîâ è òèïîâ ñ ïî- ìîùüþ ñïåöèaëèçaöèè øaáëîía ôóínöèè. Äîïóñòèì, ìû õîòèì áîëåå ýôôåêòèâíî
1 Ïîäðîáíåå î ïaðaìåòðaõ øaáëîíîâ ðaññêaçûâaåòñя â ðaçäåëå «Øaáëîíû êëaññîâ», ñ. 211.
ðåaëèçîâaòü îáùèé aëãîðèòì ñîðòèðîâêè äëя öåëûõ ÷èñåë.  ýòîì ñëó÷aå ìîæíî
«âðó÷íóþ» çaäaòü âaðèaíò øaáëîía ôóíêöèè äëя ðaáîòû ñ öåëûìè ÷èñëaìè:
vOid sOrt_vibOr(int *b, int n){
… // Òåëî ñïåöèaëèçèðîâaííîãî âaðèaíòa ôóíêöèè
}
Cèãíaòóða øaáëîía ôóíêöèè âêëþ÷aåò íå òîëüêî åå òèï è òèïû ïaðaìåòðîâ, íî è ôaêòè÷åñêèé aðãóìåíò øaáëîía. Îáû÷íaя ôóíêöèя íèêîãäa íå ñ÷èòaåòñя ñïåöèa- ëèçaöèåé øaáëîía, íåñìîòðя ía òî, ÷òî ìîæåò èìåòü òî æå èìя è òèï âîçâðaùaå- ìîãî çía÷åíèя.
Do'stlaringiz bilan baham: |