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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mirek (dyskusja | edycje)
Nie podano opisu zmian
m Zastępowanie tekstu – „\displaystyle ” na „”
 
(Nie pokazano 3 wersji utworzonych przez 2 użytkowników)
Linia 2: Linia 2:


Zaimplementuj adapter <code><nowiki>compose_f_gx_hy</nowiki></code>
Zaimplementuj adapter <code><nowiki>compose_f_gx_hy</nowiki></code>
realizujący złożenie dwuargumentowe <math>\displaystyle f(g(x),h(y))</math>.
realizujący złożenie dwuargumentowe <math>f(g(x),h(y))</math>.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Zobacz plik [http://osilek.mimuw.edu.pl/images/7/70/Compose_f_gx_hy.h compose_f_gx_hy.h].
Zobacz plik [[media:Compose_f_gx_hy.h | compose_f_gx_hy.h]].
</div></div>
</div></div>


Linia 45: Linia 45:
  };
  };


Całość kodu znajduje się w pliku [http://osilek.mimuw.edu.pl/images/2/21/Bind.h bind.h].
Całość kodu znajduje się w pliku [[media:Bind.h | bind.h]].
</div></div>
</div></div>


Linia 69: Linia 69:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Zobacz plik [http://osilek.mimuw.edu.pl/images/a/a3/Macro.h macro.h].
Zobacz plik [[media:Macro.h | macro.h]].
</div></div>
</div></div>


Linia 117: Linia 117:
  template<typename F,typename A1,typename A2> struct call_t2: public  
  template<typename F,typename A1,typename A2> struct call_t2: public  
  std::binary_function<A1,
  std::binary_function<A1,
    A2,
                      A2,
    typename functor_traits<F>::result_type> {
                      typename functor_traits<F>::result_type> {
   typedef typename functor_traits<F>::result_type result_type;
   typedef typename functor_traits<F>::result_type result_type;
   typedef typename functor_traits<F>::arg1_type arg1_type;
   typedef typename functor_traits<F>::arg1_type arg1_type;
Linia 129: Linia 129:
   
   
   result_type call(A1 a1,A2 a2,  
   result_type call(A1 a1,A2 a2,  
  generator<result_type>) {
                  generator<result_type>) {
     return _f();
     return _f();
   };
   };
   result_type call(A1 a1,A2 a2,  
   result_type call(A1 a1,A2 a2,  
  std::unary_function<arg1_type,result_type>) {
                  std::unary_function<arg1_type,result_type>) {
     return _f(a1);
     return _f(a1);
   };
   };
   result_type call(A1 a1,A2 a2,  
   result_type call(A1 a1,A2 a2,
  std::binary_function<arg1_type,arg2_type,result_type>) {
                  std::binary_function<arg1_type,arg2_type,result_type>) {
     return _f(a1,a2);
     return _f(a1,a2);
   };
   };
Linia 157: Linia 157:
  return call_t1<F,A1>(f);}
  return call_t1<F,A1>(f);}


Całość kodu znajduje się w pliku [http://osilek.mimuw.edu.pl/images/7/7d/Call.h call.h].
Całość kodu znajduje się w pliku [[media:Call.h | call.h]].


Implementując adapter <tt>macro</tt> musimy umieć poznać która z dwu przekazanych funkcji ma wiecej argumentów. Używamy w tym celu szablonu <tt>If_then_else</tt>:
Implementując adapter <tt>macro</tt> musimy umieć poznać która z dwu przekazanych funkcji ma wiecej argumentów. Używamy w tym celu szablonu <tt>If_then_else</tt>:
Linia 180: Linia 180:
defiuniujemy poprawne typy argumentów fuktora, ale niekoniecznie dobry
defiuniujemy poprawne typy argumentów fuktora, ale niekoniecznie dobry
typ wartości zwracanej. Dlatego redefinujemy go potem na <tt>void</tt>.
typ wartości zwracanej. Dlatego redefinujemy go potem na <tt>void</tt>.
Całość kodu znajduje się w pliku [http://osilek.mimuw.edu.pl/images/5/5b/Mixed_macro.h mixed_macro.h].
Całość kodu znajduje się w pliku [[media:Mixed_macro.h | mixed_macro.h]].
</div></div>
</div></div>

Aktualna wersja na dzień 09:00, 28 sie 2023

Ćwiczenie 1

Zaimplementuj adapter compose_f_gx_hy realizujący złożenie dwuargumentowe f(g(x),h(y)).

Rozwiązanie

Ć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.

Rozwiązanie

Ć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);
Rozwiązanie

Ć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)
Podpowiedź
Rozwiązanie