Tôi sẽ đi ngược lại hiện tại ở đây.
Trong C, con trỏ hàm là cách duy nhất để thực hiện tùy chỉnh, vì không có OO.
Trong C ++, bạn có thể sử dụng con trỏ hàm hoặc hàm (đối tượng hàm) cho cùng một kết quả.
Các hàm hàm có một số ưu điểm so với các con trỏ hàm thô, do bản chất đối tượng của chúng, đáng chú ý là:
- Chúng có thể gây ra một số quá tải
operator()
- Chúng có thể có trạng thái / tham chiếu đến các biến hiện có
- Chúng có thể được xây dựng tại chỗ (
lambda
và bind
)
Cá nhân tôi thích các bộ chức năng hơn các con trỏ hàm (mặc dù mã viết sẵn), chủ yếu là vì cú pháp cho các con trỏ hàm có thể dễ dàng trở nên phức tạp (từ Hướng dẫn về Con trỏ Hàm ):
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
Lần duy nhất tôi từng thấy các con trỏ hàm được sử dụng ở những nơi mà các functors không thể có trong Boost.Spirit. Họ đã hoàn toàn lạm dụng cú pháp để chuyển một số lượng tham số tùy ý làm tham số mẫu duy nhất.
typedef SpecialClass<float(float,float)> class_type;
Nhưng vì các mẫu đa dạng và lambdas đang ở gần góc, tôi không chắc chúng ta sẽ sử dụng con trỏ hàm trong mã C ++ thuần túy trong thời gian dài.