Zaawansowane CPP/Ćwiczenia 11: Funktory: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Mirek (dyskusja | edycje)
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 funktorów.
}}
}}
{{cwiczenie|3||
{{cwiczenie|3||  


Rozszerz powyższy adapter tak, aby
Zaimplementuj funktor implementujący, składanie funkcji poprzez
działał również dla jedno lub dwuargumentowych funkcji bez konieczności ich opakowywania.
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||


Zaimplementuj funktor impelemetujący, składanie funkcji poprzez
Zmodyfikuj powyższy szablon tak aby można było mieszać funkcje o różnej
wykonywanie ich po kolei:
liczbie agrgumentów np.:
int f();
void g(double);
void h(double,int);<br>
macro(f,g)(x);


  <nowiki> macro1(f1,f2)(x)</nowiki>
powinno wywołać
f();g(x)}


wykonuje <code><nowiki>f1(x);f2(x);</nowiki></code>. Wartości zwracane przez te funkcje są
a
ignorowane. Podobnie dla funkcji <code><nowiki>macro2(f1,f2)</nowiki></code>, która ma zwrócić
funktor dwuargumentowy.
macro(g,h)(3.14,0);
 
powinno  wywołać
g(3.14);h(3.14,0)
}}
}}
{{cwiczenie|5|| 
'''Wskazówka '''  Można zacząć od zaimplementowania pomocniczego adaptera
 
{call} który wywołuje funkcje dopasowując liczbę argumentów:
Zmodyfikuj powyższy szablon tak aby mogły być do niego przekazywane również funkcje bezargumentowe:
 
int f();
<nowiki> int f();
void g(double);
void g(double);
void h(double,int);


macro1(f,g)(x);</nowiki>
call<double>(f)(x); /* woła f();*/
 
call<double>(g)(x); /* woła g();*/
spowdoduje wywołanie, <math>f();g(x)</math>.
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 f(g(x),h(y)).

Ć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<>()}.