Mam zamiar pójść tutaj pod prąd.
W języku C wskaźniki funkcji są jedynym sposobem implementacji dostosowywania, ponieważ nie ma OO.
W C ++ możesz użyć wskaźników funkcji lub funktorów (obiektów funkcji) dla tego samego wyniku.
Funktory mają wiele zalet w porównaniu ze wskaźnikami funkcji surowej, ze względu na ich obiektowy charakter, a mianowicie:
- Mogą powodować kilka przeciążeń pliku
operator()
- Mogą mieć stan / odniesienie do istniejących zmiennych
- Można je zbudować na miejscu (
lambda
i bind
)
Osobiście wolę funktory od wskaźników do funkcji (pomimo standardowego kodu), głównie dlatego, że składnia wskaźników do funkcji może łatwo ulec owłosieniu (z samouczka dotyczącego wskaźników funkcji ):
typedef float(*pt2Func)(float, float);
// defines a symbol pt2Func, pointer to a (float, float) -> float function
typedef int (TMyClass::*pt2Member)(float, char, char);
// defines a symbol pt2Member, pointer to a (float, char, char) -> int function
// belonging to the class TMyClass
Jedyny raz, kiedy widziałem wskaźniki funkcji używane tam, gdzie funktory nie mogły, był w Boost.Spirit. Całkowicie nadużyli składni, aby przekazać dowolną liczbę parametrów jako pojedynczy parametr szablonu.
typedef SpecialClass<float(float,float)> class_type;
Ale ponieważ zmienne szablony i wyrażenia lambda są tuż za rogiem, nie jestem pewien, czy długo będziemy używać wskaźników funkcji w czystym kodzie C ++.