Saya akan melawan arus di sini.
Di C, pointer fungsi adalah satu-satunya cara untuk mengimplementasikan kustomisasi, karena tidak ada OO.
Dalam C ++, Anda dapat menggunakan salah satu penunjuk fungsi atau functor (objek fungsi) untuk hasil yang sama.
Functors memiliki sejumlah keunggulan dibandingkan raw function pointer, karena sifat objeknya, terutama:
- Mereka mungkin menyajikan beberapa kelebihan file
operator()
- Mereka dapat memiliki status / referensi ke variabel yang ada
- Mereka dapat dibangun di tempat (
lambda
dan bind
)
Saya pribadi lebih suka functors ke pointer fungsi (terlepas dari kode boilerplate), sebagian besar karena sintaks untuk pointer fungsi dapat dengan mudah menjadi berbulu (dari Tutorial Function Pointer ):
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
Satu-satunya saat saya pernah melihat pointer fungsi digunakan di mana functor tidak bisa berada di Boost.Spirit. Mereka benar-benar menyalahgunakan sintaks untuk meneruskan sejumlah parameter yang berubah-ubah sebagai satu parameter template.
typedef SpecialClass<float(float,float)> class_type;
Tapi karena template variadic dan lambda sudah dekat, saya tidak yakin kita akan menggunakan pointer fungsi dalam kode C ++ murni untuk waktu yang lama.