Zaawansowane CPP/Ćwiczenia 11: Funktory: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 7: | Linia 7: | ||
Korzystając z klasy <code><nowiki>functor_traits</nowiki></code> | Korzystając z klasy <code><nowiki>functor_traits</nowiki></code> | ||
zaimplementuj adpter <code><nowiki>bind1st</nowiki></code> który bedzie działał zarówno dla | zaimplementuj adpter <code><nowiki>bind1st</nowiki></code>, który bedzie działał zarówno dla funktorów jedno-, jak i dwuargumentowych. | ||
jedno i dwuargumentowych | |||
}} | }} | ||
{{cwiczenie|3|| | {{cwiczenie|3|| | ||
Zaimplementuj funktor implementujący, składanie funkcji poprzez | |||
wykonywanie ich po kolei np.: | |||
macro(f1,f2)(x) | |||
powinno wykonać | |||
f1(x);f2(x); | |||
Wartości zwracane przez te funkcje są ignorowane. Funkcja <tt>macro</tt> powinna zwracać funktor odpowiedniego typu (posiadający odpowiednie typy stowarzyszone) tak, aby możliwe było dalsze składanie np.: | |||
macro(macro(f1,f2),f3)(x) | |||
powinno wywołać: | |||
f1(x);f2(x);f3(x); | |||
}} | }} | ||
{{cwiczenie|4|| | {{cwiczenie|4|| | ||
Zmodyfikuj powyższy szablon tak aby można było mieszać funkcje o różnej | |||
liczbie agrgumentów np.: | |||
int f(); | |||
void g(double); | |||
void h(double,int);<br> | |||
macro(f,g)(x); | |||
powinno wywołać | |||
f();g(x)} | |||
a | |||
macro(g,h)(3.14,0); | |||
powinno wywołać | |||
g(3.14);h(3.14,0) | |||
}} | }} | ||
{ | '''Wskazówka ''' Można zacząć od zaimplementowania pomocniczego adaptera | ||
{call} który wywołuje funkcje dopasowując liczbę argumentów: | |||
int f(); | |||
void g(double); | void g(double); | ||
void h(double,int); | |||
call<double>(f)(x); /* woła f();*/ | |||
call<double>(g)(x); /* woła g();*/ | |||
call<double,double>(f)(x,y); /* woła f();*/ | |||
call<double,int>(g)(x,i); /* woła g(x);*/ | |||
call<double,int>(h)(x,i); /* woła h(x,i);*/ | |||
Argumenty szablomnu określają typy argumentów funktora zwracanego przez | |||
{call<>()}. |
Wersja z 10:33, 25 wrz 2006
Ćwiczenie 1
Zaimplementuj adapter compose_f_gx_hy
realizujący złożenie dwuargumentowe .
Ćwiczenie 2
Korzystając z klasy functor_traits
zaimplementuj adpter bind1st
, który bedzie działał zarówno dla funktorów jedno-, jak i dwuargumentowych.
Ćwiczenie 3
Zaimplementuj funktor implementujący, składanie funkcji poprzez wykonywanie ich po kolei np.:
macro(f1,f2)(x)
powinno wykonać
f1(x);f2(x);
Wartości zwracane przez te funkcje są ignorowane. Funkcja macro powinna zwracać funktor odpowiedniego typu (posiadający odpowiednie typy stowarzyszone) tak, aby możliwe było dalsze składanie np.:
macro(macro(f1,f2),f3)(x)
powinno wywołać:
f1(x);f2(x);f3(x);
Ćwiczenie 4
Zmodyfikuj powyższy szablon tak aby można było mieszać funkcje o różnej liczbie agrgumentów np.:
int f(); void g(double); void h(double,int);
macro(f,g)(x);
powinno wywołać
f();g(x)}
a
macro(g,h)(3.14,0);
powinno wywołać
g(3.14);h(3.14,0)
Wskazówka Można zacząć od zaimplementowania pomocniczego adaptera {call} który wywołuje funkcje dopasowując liczbę argumentów:
int f(); void g(double); void h(double,int);
call<double>(f)(x); /* woła f();*/ call<double>(g)(x); /* woła g();*/ call<double,double>(f)(x,y); /* woła f();*/ call<double,int>(g)(x,i); /* woła g(x);*/ call<double,int>(h)(x,i); /* woła h(x,i);*/
Argumenty szablomnu określają typy argumentów funktora zwracanego przez {call<>()}.