2012-03-18 22 views
10

mam:Howto: C++ wskaźnik funkcji z wartościami domyślnymi

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

jak bym określić RespExtractor przyjąć funkcję z domyślnymi parametrami, takimi mogę zadzwonić:

predict_image(im_in,im_out,create_hough_features); 

Próbowałem następujących , bez powodzenia:

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

Domyślne parametry nie są częścią podpisu funkcji ... –

+0

więc nie mogę osiągnąć czego chcę ? –

+0

Nie tędy. Rozważmy std :: function zamiast – Lol4t0

Odpowiedz

8

Same wskaźniki funkcji nie mogą mieć wartości domyślnych. Będziesz musiał albo owijać wywołanie za pomocą wskaźnika funkcji w funkcji, która ma domyślne parametry (może to być nawet mała klasa, która otacza wskaźnik funkcji i ma operator() z domyślnymi paremeterami), albo mają różne wskaźniki funkcji dla różne przeciążenia twoich funkcji.

+0

Dobra sugestia dotycząca przykładu klasy. –

+0

Utworzono wrapper klasy, czy możliwe jest utworzenie streszczenia operatora w klasie bazowej. –

+1

@ s093294: jest, ale odradzam go. Radziłbym używać zwykłej funkcji, jeśli jest ona wirtualna ... pytanie brzmiałoby, dlaczego miałaby być wirtualna, skoro już wywołuje wskaźnik funkcji? –

4

Parametry domyślne nie są częścią sygnatury funkcji, więc nie można tego zrobić bezpośrednio.

Jednakże, można zdefiniować funkcję otoki dla create_hough_features, lub po prostu sekund przed przeciążeniem, że tylko przyjmuje dwa argumenty:

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

Dzięki. Zrobiłem typedef void (* RespExtractor) (const cv :: Mat & image, cv :: Mat i resp, FeatureParams &); i predict_image (im_in, im_out, create_hough_features, FeatureParams & par = DefaultParams()); –

+0

Odpowietrzaj z sugestią @pmjordan –

Powiązane problemy