Dziękuję za zainteresowanie! :)
Nie liczyłem na tak szybką reakcję.
Zdążyłem coś skrobnąć bazując na przykładzie od @adf88 :
//[EDIT: v2.0]
/* \file
* \brief Przyklad na klasach
*/
#include <iostream>
using namespace std;
class Potega{
int wykladnik;
public:
double operator()(double x){
return poteguj(x);
}
double poteguj(double x){
double temp=x;
for(int i=0; i<wykladnik; i++)
temp*=x;
return temp;
}
void ustaw_wykladnik(int w){ wykladnik=w; }
};
class Optymalizator{
public:
template <typename KFunk>
double optymalizuj(KFunk funk);
};
template <typename KFunk>
double Optymalizator::optymalizuj(KFunk funk){
return funk(2);
}
double kwadrat(double x){
return x*x;
}
int main(){
Optymalizator opt1;
Potega pot1;
pot1.ustaw_wykladnik(3);
cout << "Wynik: " << opt1.optymalizuj(pot1) << endl;
cout << "Wynik: " << opt1.optymalizuj(kwadrat) << endl;
return 0;
}
Fajnie wygląda przykład od @MarekR22, niedługo spróbuję.
[EDIT:]
Tak jak wspomniałem spróbowałem i przerobiłem powyższy kod na wersję z dziedziczeniem (wrzucam może komuś się przyda):
/* \file
* \brief Przyklad na klasach
*/
#include <iostream>
using namespace std;
class Potega{
int wykladnik;
public:
double operator()(double x){
return poteguj(x);
}
double poteguj(double x){
double temp=x;
for(int i=0; i<wykladnik; i++)
temp*=x;
return temp;
}
void ustaw_wykladnik(int w){ wykladnik=w; }
};
class Optymalizator{
public:
template <typename KFunk>
double optymalizuj(KFunk funk);
};
template <typename KFunk>
double Optymalizator::optymalizuj(KFunk funk){
return funk(2);
}
double kwadrat(double x){
return x*x;
}
int main(){
Optymalizator opt1;
Potega pot1;
pot1.ustaw_wykladnik(3);
cout << "Wynik: " << opt1.optymalizuj(pot1) << endl;
cout << "Wynik: " << opt1.optymalizuj(kwadrat) << endl;
return 0;
}
W sumie oba sposoby są fajne.
Jeśli dobrze rozumiem (Z szablonów i dziedziczenia do tej pory nie korzystałem, a z metod wirtualnych rzadko):
Sposób z klasą bazową dla funkcji jest o tyle lepszy że kontroluje się typ przekazywany w argumencie (musi być klasą z przeciążeniem operatora "()").
Natomiast wersja z szablonem ma tę zaletę że mogę podstawić dowolną klasę (nie musi być klasą pochodną), a nawet zwykłą funkcję (dodałem do przykładu funkcję kwadrat).