2013-10-04 35 views
1
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sstream> 

using namespace std; 

template <class T> 
T Summation(T a, T b, T c) { 
    return (a+b+c); 
} 

int main() { 
    char e = '5', f = '6', g = '7', h; 
    int a = 5, b = 6, c = 7, d; 

    h=Summation<char>(e,f,g); 
    cout << h << endl; 
    d=Summation<char>(a,b,c); 
    cout << d << endl; 
} 

我必須使用求和一個模板,我需要打印出18相同的類型參數的。所以程序應該返回18作爲char類型,那麼下一行應該返回18作爲int類型。我怎樣才能得到三個char數字的總和?

+2

通過3個參數? –

+0

是的,對不起,這是一個錯誤,但我糾正它 – user1082764

+0

如果字中,h == 18',然後'COUT << h'可能只打印空白。 – aschepler

回答

2

您可以使用通用模板對於大多數類型,並添加一個專業化的字符:

template <class T> 
T Summation(T a, T b, T c) { 
    return (a+b+c); 
} 

template <> 
char Summation<char>(char a, char b, char c) { 
    return ((a - '0') + (b - '0') + (c - '0')); 
} 

使用(就像你的例子有,只是類型由編譯器推斷):

char e = '5', f = '6', g = '7', h; 
    int a = 5, b = 6, c = 7, d; 

    h= Summation(e,f,g); 
    d= Summation(a,b,c); 
+0

這會工作,但由於某種原因,它不會返回任何東西作爲一個字符,即使A = B = C = 1 – user1082764

+0

@ user1082764您需要要麼傳遞char類型變量的參數,要麼將參數強制轉換爲char,要麼顯式調用char類型:Summation (1,1,1); –

+0

編譯器必須推斷參數是char類型的被稱爲右專業化 –

-2

目前尚不清楚,如果你需要模板元編程還是什麼,一個簡單的解決辦法是這樣的:

template <char A, char B, char C> 
int char_sum() 
{ 
    return (A-'0')+(B-'0')+(C-'0'); 
} 

std::cout << "sum is " << char_sum<'5','6','7'>() << std::endl; 

記住,如果我沒記錯的話,它是安全的假設數字是在連續值編碼(所以A-'0'是安全的操作)由ISO標準強加。

2

最簡單的方法是不使用的所有模板,只是做:

int Summation(int a, int b, int c) 
    { 
     return a + b + c; 
    } 

    int Summation(char a, char b, char c) 
    { 
     return a - '0' + b - '0' + c - '0'; 
    } 

但是如果你必須使用模板:

template <class T> 
    int Summation(T a, T b, T c) 
    { 
     T offset = std::is_same<T, char>::value ? '0' : 0; 
     return a - offset + b - offset + c - offset; 
    } 

請注意,您不能返回18作爲炭在具有字符「18」(實際上這是一個多字符文字,但它們不是便攜式)這樣的功能在我的例子以上無論其類型T的返回int感。

編輯

的方式來調用它是這樣的:

char e = '5', f = '6', g = '7'; 
    int a = 5, b = 6, c = 7; 
    cout << Summation(a,b,c) << endl; 
    cout << Summation(e,f,g) << endl; 

不要指定使用(即不做Summation<char>(...))的類型,編譯器可以計算它自己出來,應該儘可能地做到這一點。
如果您將結果類型存儲在char中,並使用cout將其打印出來,它將打印出char(char)18不是ASCII字符,您獲得的內容取決於您的控制檯。確保打印時的類型爲int,在兩種情況下都會得到18

+0

第二個解決方法沒有返回時,A,B和C是字符,但它工作正常與詮釋 – user1082764