Wzorce funkcji i makra funkcyjne

Rozważmy banalny przykład znajdowania większej z dwóch liczb. Możemy napisać funkcję, która znajduje takie maksimum. Funkcja taka będzie miała jedno ograniczenie: zadziała tylko dla określonego typu danych, mimo że kod takiej funkcji wygląda tak samo bez względu na typ argumentów. Ograniczenie to można obejść na dwa sposoby.

Makra

Pierwszym z nich są makra. Dyrektyw #define może służyć nie tylko do definiowania stałych, ale również do tworzenia makr.
#define MAX(A,B) ((A) > (B)) ? (A) : (B)

Przykładowe użycie MAX(a,b) zastąpione zostanie napisem: ((a) > (b)) ? (a) : (b). Można też używać jednoargumentowego operatora #, który spowoduje umieszczenie argumentu w cudzysłowiu oraz dwuargumentowego operatora ##, który konkatenuje (skleja) dwa łańcuchy.

Wzorce funkcji

Wzorce funkcji albo funkcje parametryzowane typem. Tę samą rolę, ale w bardziej zaawansowany sposób pełnią funkcje parametryzowane typem.
template < class T >
T max(T x, T y)
{
  return (x > y) ? x : y;
};
W tym przykładzie parametrami funkcji max są nie tylko zmienne a i b, ale również ich typ T. Mówimy tu o wzorcu funkcji, jako że na podstawie tego wzorca kompilator wygeneruje tyle funkcji ile tylko sobie zażyczymy podstawiając za T różne typy. Przeanalizuj przykład: wzorce.cpp i odpowiedz na pytanie jakie zalety i wady ma korzystanie z wzorców w stosunku do makr.

Przykładowe zadania

Napisz makro, (wzorzec funkcji) wyznaczającej minimum, (maksimum) z trzech, (czterech liczb).

Napisz makro, (wzorzec funkcji) wyznaczającej minimum, (maksimum) z tablicy o n elementach.

Podobnie jak poprzednie dla zadań z tablicami, które już pojawiły się na zajęciach: odbijanie tablic, liczenie statystyk, przesuwanie elementów,sklejanie itp.

Wróć