Rešitev je uporaba šablon (ang. template)!
template<typename TIP>
TIP sestejPolje(TIP polje[], int size)
{
TIP suma=0;
for(int i=0;i<size;i++)
{
suma+=polje[i];
return suma;
}
template<>
string sestejPolje(string polje[],int size)
{
string suma="";
for(int i=0;i<size;i++)
suma+=polje[i];
return suma;
}
Šablono napišemo pred funkcijo nad katero se naj uveljavi. "typename TIP" pa nam pove da bo univerzalna spremenljivka naziva TIP
TIP suma=0;
Nam pove da bo spremenljivka suma tipa, kateri je bil podan kot šablona.
cout<<sestejPolje(dPolje,4);
//dPolje je polja tipa double
Prevajalnik bo prepoznam katerega tipa je dPolje in zato kot template določil, da bo TIP -> double.
//če tega ne bi mogel, zaradi kakšnega dvoumentega parametra, pa lahko vedno najavimo tip eksplicitno!
cout<<sestejPolje<double>(dPolje,4);
template<>
Le kaj to pomeni?
Ker stringu ob inicializaciji ne moremo prirediti 0,
(konstruktor ga avtomatsko nastavi na prazni niz) mora koda izgledati malce drugače. Še vedno pa se mora obnašati kot prejšna funkcija oz. nosi isto ime.
S tem najavimo da mora prevajalnik pogledati kakšnega tipa je vhodni argument.
template<>
string sestejPolje(string polje[],int size)
In če je ta tipa string, potem mora uporabiti to funkcijo! Saj je ta eksplicitno rezervirana zanj.
Primer:
template<typename TIP>
TIP sestejPolje(TIP polje[], int size)
{
TIP suma=0;
for(int i=0;i<size;i++)
suma+=polje[i];
return suma;
}
template<>
string sestejPolje(string polje[],int size)
{
string suma="";
for(int i=0;i<size;i++)
suma+=polje[i];
return suma;
}
int main()
{
double dPolje[] = {0.1,0.2,0.3,0.4};
int iPolje[] ={1,2,3,4};
string sPolje[] ={"1","2","3","4"};
cout<<sestejPolje<double>(dPolje,4)<<endl<<sestejPolje(iPolje,4)<<endl<<sestejPolje(sPolje,4)<<endl;
cin.get();
return 0;
}