Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 107: | Linia 107: | ||
</math></center> | </math></center> | ||
i implementujemy ją korzystając z wcześniej zdefiniowanych szablonów: | |||
template<int N> double sin(double x) { | |||
return sin<N-1>(x) + (N%2?1:-1)*pow<(2*N-1)>(x)/factorial<2*N-1>::val; | |||
}<br> | |||
template<> double sin<0>(double x) { | |||
return 0; | |||
}<br> | |||
template<int N> double inner(double *a, double *b) { | |||
return (*a)*(*b)+inner<N-1>(++a,++b); | |||
}<br> | |||
template<> double inner<1>(double *a, double *b) { | |||
return (*a)*(*b); | |||
} | |||
Patrz plik [http://osilek.mimuw.edu.pl/images/9/9c/Pown.h inner.h]. | |||
Patrz plik [http://osilek.mimuw.edu.pl/images/9/9c/Pown.h | |||
</div></div> | </div></div> | ||
Wersja z 11:30, 21 wrz 2006
Ćwiczenie 1
Napisz szablon funkcji lub klasy wyliczający funkcję silnia:
Ćwiczenie 2
Zaimplementuj szablon Pow<N,M>
obliczający
. Np.:
Pow<3,4>::val;
powinno mieć wartość 81.
Ćwiczenie 3
Wymyśl i zaimplementuj jako metaprogram szybszy algorytm funkcji pow(x)
.
Ćwiczenie 4
Napisz szablon generujący pierwsze wyrazów rozwinięcia funkcji :
Możesz skorzystać z rozwiązań wcześniejszych zadań.
Ćwiczenie 5
Napisz szablon generujący funkcję implementującą iloczyn skalarny dwu wektorów.
template<size_t N> double inner(double *x, double *y);
Parametrem szablonu ma być dlugość mnożonych wektorów.
Ćwiczenie 6
Rozszerz powyższy szablon tak, aby również typ elementów wektora był parametrem szablonu:
template<size_t N, typename T> T dot(T *x, T *y);
Ćwiczenie 7
Napisz szablon generujący funkcję implementującą iloczyn macierzy i wektora o elementach:
void matrix_v<N>(double *A,double *v,double *u)
Tablica jest reprezentowana w pamięci zgodnie z konwencją , tzn. wiersz po wierszu: elementowi odpowiada .