2015-06-05 46 views
3

是否有可能寫在C中的通用求和函數?函數的通用總和在c

我想寫一個處理任何數字類型的求和函數。

double sum(void* myArrayVoidPtr, size_t arrayLength, int arrayType){ 
    int i; 
    double result = 0; 

    //The goal is to make this next line depend on arrayType 
    //e.g. if(arrayType == UINT16) 
    unsigned short* myArrayTypePtr = (unsigned short*) myArrayVoidPtr; 

    for(i = 0; i < arrayLength; i++){ 
     result += *myArrayTypePtr; 
     myArrayTypePtr++; 
    } 
    return result; 
} 
+4

是你可以,但不喜歡這樣。 – haccks

+0

「任意」數據不會總結爲兩倍。而'+'也不適用於「任意」類型。 –

+0

將問題從「任意」更改爲「任何數字」。 – naroom

回答

3

它不可能讓在C與C++的通用功能,你不必templates。模板允許您創建同一功能的多個版本,它們與type(即 - int,float或任何class)的差異在於它們「接受」。 這意味着函數將被編譯多次

C沒有模板,但你可以爲它寫一個宏。這基本上等同於C++的模板,功能不那麼強大。它會被「內聯」,而不是一個真正的功能。

#define SUM(arr, len, sum) do { int i; for(i = 0; i < len; ++i) sum += arr[i]; } while(0); 

int main(void) { 
    int i_arr[] = {1,2,3}; 
    double d_arr[] = {1.5, 2.5, 3.5}; 
    int sum = 0; 
    double d_sum = 0; 
    SUM(i_arr, 3, sum) 
    SUM(d_arr, 3, d_sum); 
    printf("%d, %f\n", sum, d_sum); 
    return 0; 

} 

輸出:

6, 7.500000 
+0

爲什麼不可能?你可以創建一個通用函數。 – haccks

+1

@haccks你如何定義一個通用函數?你沒有C中的模板。你可以做的最接近的事情是一個宏,或者手動編寫相同方法的多個實例。 –

+1

您需要一個包含'union'和數據成員的數據類型的結構。我現在沒有時間,否則我會發布代碼。 – haccks