Zaawansowane CPP/Ćwiczenia 11: Funktory: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 116: | Linia 116: | ||
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, | <nowiki>std::binary_function<A1, | ||
A2, | |||
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>) { | |||
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>) { | |||
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>) { | |||
return _f(a1,a2); | return _f(a1,a2); | ||
}; | }; |
Wersja z 11:07, 25 wrz 2006
Ćwiczenie 1
Zaimplementuj adapter compose_f_gx_hy
realizujący złożenie dwuargumentowe .
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