Zaawansowane CPP/Ćwiczenia 8: Metaprogramowanie: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 190: | Linia 190: | ||
Najpierw definiujemy szablon, który wykonuje mnożenie <tt>I</tt>-tego wiersza macierzy <tt>A</tt> przez wektor <tt>v</tt>: | Najpierw definiujemy szablon, który wykonuje mnożenie <tt>I</tt>-tego wiersza macierzy <tt>A</tt> przez wektor <tt>v</tt>: | ||
template<size_t | template<int M,size_t I> double row_vec(double *A, double *v) { | ||
return inner<M>(A+I*M,v); | |||
} | |||
Następnie implementujemy rekurencyjnie mnożenie kolejnych wierszy macierzy: | |||
template< | |||
static | template<int N,int M> struct matrix_vec_c { | ||
static void matrix_vec(double *A,double *v,double *u) { | |||
u[N-1]=row_vec<M,N-1>(A,v); | |||
matrix_vec_c<N-1,M>::matrix_vec(A,v,u); | |||
} | } | ||
};<br> | |||
template<int M> struct matrix_vec_c<0,M> { | |||
static void matrix_vec(double *A,double *v,double *u) {} | |||
}; | }; | ||
Używamy szablonu klasy aby móc wykorzystać specjalizację częściową. Tak jak w poprzednim zadaniou opakowujemy wywołanie metody w szablon funkcji: | |||
template<size_t N, | template<size_t N,size_t M> | ||
inline void matrix_vec(double *u,double *A,double *v) { | |||
} | matrix_vec_c<N,M>::matrix_vec(A,v,u); | ||
} | |||
Całość kodu znajduje się w pliku [http://osilek.mimuw.edu.pl/images/8/8b/Inner.h matrix.h]. | |||
</div></div> | </div></div> |
Wersja z 12:05, 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 .