2

我想創建一個計算器澄清模板功能專業化

template < typename T > 
class Calculator 
{ 
    public : 
    Calculator (void); 
    ~Calculator (void); 

    T add(T a, T b) 
    { 
     return (a + b) ; 
    } 
}; 

現在,我想使這個計算器中計算出添加字符串,因此加(「添」,「喬」)應給我「TimJoe」。

我可以通過對現有類進行必要的更改來使用模板函數專門化來實現此目的。

回答

3

你爲什麼要?

Calculator<std::string> a; 
std::cout << a.add("Hello", " world") << std::endl; 

此代碼輸出「Hello world」。它不是最優的(std::string成員函數中的add參數是按值取值的),但它不需要專門化工作。

編輯好的,你想要專業化,但你不能只專注於add成員函數,因爲該函數本身不是模板。您可以專注全班:

template<> 
class Calculator<std::string> 
{ 
public : 
    Calculator() {} 
    ~Calculator() {} 

    std::string add(const std::string &a, const std::string &b) 
    { 
     // Do std::string specific stuff 
     return a + b ; 
    } 
}; 

,或使add成員函數模板,並專注它:

class Calculator 
{ 
public : 
    Calculator() {} 
    ~Calculator() {} 

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

template<> 
std::string Calculator::add<std::string>(std::string a, std::string b) 
{ 
    // Do std::string specific stuff 
    return a + b ; 
} 

用第二種方案,那麼單個Calculator實例將能夠添加intstd::string或任何你需要的東西(因爲它的add功能是模板,而不是Calculator類本身)。

+0

@silico,@icecrime,通過使用STL,我可以做到這一點;但我想用模板專業化 – 2010-11-22 10:36:57

+0

@Sujay Ghosh:爲什麼需要模板專業化?使用'std :: string'遠不如創建'Calculator '的新專門化。 – 2010-11-22 10:38:23

+0

我認爲第二個解決方案是一個更好的設計。如果有一天我想添加一個自定義類,而不是任何PODS,這將解決我的問題。 – 2010-11-26 07:00:12

4

如果使用std::string,那麼你就不必在所有處理模板特:

Calculator<std::string> calc; 
std::string result = calc.add("Tim", "Joe"); 
// result contains "TimJoe" 

這實際上做什麼,你認爲它歸功於標準庫的「神奇」,而無需寫出其他課程。

我會,但是通過使add()通過const T&接受參數修改模板類:

template < typename T > 
class Calculator 
{ 
public : 
    Calculator() {}; 
    ~Calculator() {}; 

    // Note that we're taking in parameters by const T& 
    // to avoid copies if instances of T are large. 
    T add(const T& a, const T& b) 
    { 
     return (a + b) ; 
    } 
}; 
1

有可能

這是你可以專注你的成員函數的方式(即使是已經@icecrime和@In硅片提到它不是在這種情況下,對於字符串neccessary):

#include <iostream> 
#include <string> 

using namespace std; 

template < typename T > 
class Calculator 
{ 
    public : 
    Calculator() {} 
    ~Calculator() {} 

    T add(const T& a, const T& b); 
}; 

template <typename T> 
T Calculator<T>::add(const T& a, const T& b) 
{ 
    return (a + b); 
} 

template <> 
string Calculator<string>::add(const string& a, const string& b) 
{ 
    return (a + " " + b); 
} 

int main() 
{ 
    Calculator<string> ccs; 
    cout << ccs.add("a", "b") << endl; 

    Calculator<int> cci; 
    cout << cci.add(1, 2); 
} 

輸出是:

a b 
3 

注意,它仍然表現爲你所期望的,所以你不能例如該做的事:

Calculator<int> cci; 
    cout << cci.add("a", "b"); 
+0

此代碼無法編譯.- LNK1169:找到一個或多個乘法定義的符號 – 2010-11-26 06:56:20

+0

您的結局肯定有問題。它適用於我沒有抱怨與g ++ -ansi -pedantic -Wall -Wextra,它也可以在鍵盤上(它有IIRC打開相同的標誌)見http://codepad.org/ZS2QJQQV – Palmik 2010-11-26 13:19:00