我在尋找一種優雅的方式,以避免重新寫一個函數,它的實現幾乎是相同的,但只有簽名(輸入參數和數據類型的數量)是不同的。我知道函數重載在C中是不可能的。我也知道可變參數函數的存在。但我認爲他們在這種情況下不會有所幫助。替代函數重載用C
考慮下面的問題,在這裏我們需要計算一個三角形的面積。我們有兩個函數實現兩個不同的公式:S = 1/2bh和S = sqrt(s(s-a)(s-b)(s-c))。除計算面積外,每個功能還修改參數nb
或nthr
。最後,還有日常bisect_area_...
頂部水平在給定的功能area_tria1
或area_tria2
優化它的參數nb
或nthr
啓動二分法過程。目前,我明確實施了兩個二分功能:一個用於area_tria1
的簽名,另一個用於area_tria2
。我覺得必須有一個更好,更優雅的方式,這將允許有一個單一的通用二分功能bisect_area_tria()
。請注意,在實際情況中,我手邊的輸入參數數據類型也有所不同。
下面是函數簽名的骨架僞代碼:
// Calculate area of triangle, modify and return parameter 'nb'
void area_tria1_nb(..., int *nb, double b, double h, double *S) {
// change parameter 'nb'
...
S = 0.5*b*h;
}
// Calculate area of triangle, modify and return parameter 'nthr'
void area_tria1_nthr(..., int *nthr, double b, double h, double *S) {
// change parameter 'nthr'
...
S = 0.5*b*h;
}
// Optimise calculation of area of triangle, for parameter 'nb' or 'nthr'
void bisect_area_tria1(..., double b, double h, double *S, int (*area_tria1)(double, double)) {
}
// Calculate area of triangle, modify and return parameter 'nb'
void area_tria2_nb(..., int *nb, double a, double b, double c, double *S) {
// change parameter 'nb'
...
S = sqrt(s*(s-a)*(s-b)*(s-c));
}
// Calculate area of triangle, modify and return parameter 'nthr'
void area_tria_2_nthr(..., int *nthr, double a, double b, double c, double *S) {
// change parameter 'nthr'
...
S = sqrt(s*(s-a)*(s-b)*(s-c));
}
// Optimise calculation of area of triangle, for parameter 'nb' or 'nthr'
void bisect_area_tria2(..., double a, double b, double c, double *S, int (*area_tria2)(double, double, double)) {
}
void main() {
bisect_area_tria1(..., &nb, b, h, &S, area_tria1_nb);
bisect_area_tria1(..., &nthr, b, h, &S, area_tria1_nthr);
bisect_area_tria2(..., &nb, a, b, c, &S, area_tria2_nb);
bisect_area_tria2(..., &nthr, a, b, c, &S, area_tria2_nthr);
}
「避免代碼重複」和「功能重載」幾乎沒有任何關係。 –
'無效area_tria1_nb(...,INT * NB,雙B,雙H,雙* S)'肯定這不是一個有效的原型。 –
作爲一種模糊的評論...也許多態性可以讓你使用一個函數來執行你想要的各種行爲。 – byxor