2012-03-18 52 views
10

tôi có:Howto: C++ con trỏ hàm với giá trị mặc định

typedef void (*RespExtractor) (const cv::Mat & image, cv::Mat & resp); 

virtual void predict_image(const cv::Mat & src, 
      cv::Mat & img_detect,cv::Size patch_size, 
      RespExtractor); 

void create_hough_features(const cv::Mat & image, cv::Mat & resp, FeatureParams & params = FeatureParams()); 

Làm thế nào tôi sẽ xác định RespExtractor để chấp nhận một chức năng với các thông số mặc định, chẳng hạn tôi có thể gọi:

predict_image(im_in,im_out,create_hough_features); 

tôi đã cố gắng sau , không có thành công:

typedef void (*RespExtractor) (const cv::Mat & image, cv::Mat & resp,FeatureParams params, FeatureParams()); 
+1

thông số mặc định là không nằm trong chữ ký chức năng ... –

+0

Vì vậy, tôi không thể đạt được những gì tôi muốn ? –

+0

Không phải theo cách này. Hãy xem xét std :: function thay vì – Lol4t0

Trả lời

8

Con trỏ hàm không thể có giá trị mặc định. Bạn sẽ phải kết thúc cuộc gọi thông qua con trỏ hàm trong một hàm không có tham số mặc định (thậm chí có thể là lớp nhỏ kết thúc tốt hơn con trỏ hàm và có một số operator() với mặc định) hoặc có các con trỏ hàm khác nhau cho các tình trạng quá tải khác nhau của các chức năng của bạn.

+0

Đề xuất tốt về ví dụ lớp. –

+0

Tôi đã tạo một trình bao bọc lớp, có thể tạo một toán tử trừu tượng trong lớp cơ sở. –

+1

@ s093294: đúng vậy, nhưng tôi khuyên bạn nên chống lại nó. Tôi sẽ khuyên bạn nên sử dụng một hàm bình thường nếu nó cần ảo ... câu hỏi dĩ nhiên là, tại sao nó lại là ảo, vì nó đã gửi đến một con trỏ hàm? –

4

Thông số mặc định không phải là một phần của chữ ký hàm, do đó bạn không thể thực hiện việc này trực tiếp.

Tuy nhiên, bạn có thể định nghĩa một hàm wrapper cho create_hough_features, hay chỉ là một tình trạng quá tải thứ hai mà chỉ mất hai đối số:

void create_hough_features(const cv::Mat & image, cv::Mat & resp, FeatureParams & params) { 
    // blah 
} 

void create_hough_features(const cv::Mat & image, cv::Mat & resp) { 
    create_hough_features(image, resp, DefaultParams()); 
} 
+0

Cảm ơn. Tôi đã typedef void (* RespExtractor) (const cv :: Mat & hình ảnh, cv :: Mat & resp, FeatureParams &); và guess_image (im_in, im_out, create_hough_features, FeatureParams & par = DefaultParams()); –

+0

Thông báo với đề xuất của @pmjordan –

Các vấn đề liên quan