2012-03-18 82 views
10

我:HOWTO:C使用默認值++函數指針

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()); 

我會如何定義RespExtractor接受使用默認參數,這樣的功能,我可以致電:

predict_image(im_in,im_out,create_hough_features); 

我嘗試以下,但沒有成功:

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

的默認參數是不是函數簽名的一部分... – 2012-03-18 17:52:33

+0

,所以我不能做到我想要的是 ? – 2012-03-18 17:53:39

+0

不是這樣。考慮std :: function – Lol4t0 2012-03-18 17:56:01

回答

8

函數指針本身不能有默認值。你要麼必須通過函數指針將函數指針包裝在一個有默認參數的函數中(這甚至可以是一個包裝函數指針的小類,並且具有帶默認參數的operator()),或者具有不同的函數指針你的函數有不同的重載。

+0

關於類示例的好建議。 – 2012-03-18 18:05:09

+0

我創建了一個類封裝器,是否有可能在基類中創建一個運算符抽象。 – 2012-03-18 18:28:46

+1

@ s093294:這是,但我會建議反對它。如果需要虛擬的話,我會建議使用常規函數......當然問題是,爲什麼它應該是虛擬的,因爲它已經調度到函數指針了? – 2012-03-18 19:29:23

4

默認參數不是函數簽名的一部分,所以您不能直接執行此操作。

但是,你可以定義一個包裝功能create_hough_features,或者只是一個第二重載,只需要兩個參數:

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

謝謝。我沒有typedef void(* RespExtractor)(const cv :: Mat&image,cv :: Mat&resp,FeatureParams&);和predict_image(im_in,im_out,create_hough_features,FeatureParams&par = DefaultParams()); – 2012-03-18 18:04:21

+0

以@pmjordan的建議發泄 – 2012-03-18 18:29:29