2013-12-15 66 views
-2

我正在爲字符串編寫比較器。不過,我希望它可以用於字符串和char * s。 類似於StringComparer<std::string, std::string>StringComparer<const char *, const char*>。當然,在執行Stringcomparer<const char *, const char *>的時候,我會簡單地爲這兩個字符串做一個std::string Stringversion(<pass the const char* here>),並簡單地調用Stringcomparer<std::string, std::string>提供模板化函數的多個實現,每次處理特定類型

如何爲我的Stringcomparer編寫兩個這樣的模板化函數。

我一直在尋找這和所有我能找到到處是人們定義的函數像這樣的例子:

template <typename T> foo(T&) 
{ 
    //some operation on T that does depends on operators or functions that can handle any //type like sort or cout. basically there are showing that this fucntion can be used to sort //both integer and string vectors or it can cout both integers and floats. 
} 

能否請你告訴我,我能提供給我的stringcomparer的多個變體。當然,有些時候人們需要編寫單獨的例程來處理每種類型。這是如何完成的。

回答

3

可以聲明一個主要功能模板和[全]它專門針對不同類型,例如:

template <typename T> void foo(T&);     // primary template declaration 
template <> void foo<std::string>(std::string& s) { // specialization for std::string 
    // ... 
} 
template <> void foo<char*>(char *&s) {    // specialization for char* 
    // ... 
} 

注意,特要配合專業的類型完全更換了主模板!一般來說,我發現專門化類模板實現函數對象(即,有一個函數調用操作符)並從一個通用函數模板委託給它們更容易。

1

您可以使用模板專業化。這是一個簡短的例子。

template <typename T> 
void foo(const T& arg) 
{ 
    // code 
} 

// Specialises the function template for char* 
template <> 
void foo(const char*& arg) 
{ 
    // different code 
} 

編輯:哎呀,專門爲字符串開始。

+0

爲什麼不只是超載?那麼非標準'basic_string's呢? –

+0

@KerrekSB更好地問OP! – polkadotcadaver

+0

@KerrekSB我不能使用重載,因爲我正在爲已經存在的代碼庫編寫代碼,它需要模板化函數。 (已經實現了一個測試套件)你能解釋一下你對「非標準基本字符串」的查詢嗎? – Chani

相關問題