2012-09-19 45 views
1

我想提高我目前在C++模板中的知識,並且遇到了一個問題。是否可以編寫一個接受所有寬字符類型的模板函數,比如std :: wstring,wchar_t,wchar_t *等等?下面是說明我的意思的例子:所有寬字符類型的模板專業化

template <typename T> Function(T1 var) 
{ 
    // Do something with std::stringstream and the passed var; 
} 

上面的功能的問題是,它不與wchar_t的或std :: wstring的例如工作。您需要使用std :: wstringstream。我可以專注現在想:

template <> Function(wchar_t var) 
{ 
    // Do something with std::wstringstream and the passed var; 
} 

現在我會寫的每個寬字符串類型相同的功能,但有可能專門一次涵蓋所有寬字符串類型?

Thx提前!

+0

當然,第一個函數適用於所有類型。問題是你不顯示代碼,我猜你有一些靜態類型在那裏聲明。向我們展示您想要的函數實現 –

+3

您可能只需使用'std :: basic_stringstream'和一個依賴於模板參數的模板參數。 'std :: stringstream'實際上是'std :: basic_stringstream '和'std :: wstringstream'是'std :: basic_stringstream '。 – chris

+1

'wchar_t'和'wchar_t *'是兩個不同的東西。我不太清楚你的功能應該做什麼... –

回答

3

使用特徵技術。定義一些is_wide_char_type類模板。就像這樣:

template <T> 
struct is_wide_char_type { static const bool VALUE = false; }; 
template <> 
struct is_wide_char_type<wchar_t> { static const bool VALUE = TRUE; }; 
... for others types the same. 

然後專注你的函數有兩個版本,你需要定義類模板,因爲函數模板不能是部分專業:

template <typename T, boo isWideChar> class FunctionImpl; 
template <typename T> struct FunctionImpl<T, false> { 
    static void doIt() { 
    // code for not wide char types 
    } 
}; 
template <typename T> struct FunctionImpl<T, true> { 
    static void doIt() { 
    // code for wide char types 
    } 
}; 


template <typename T> Function(T1 var) 
{ 
    FunctionImpl<T, is_wide_char_type<T>::VALUE>::doIt(); 
} 

或考慮以使其更容易和特質包圍is_wide_char_type<T>不是T類型的標籤信息,而是關於使用哪個stringstream以及任何你喜歡的。

+0

謝謝PiotrNycz那就是什麼我在尋找!有趣的是我幾乎到了你的解決方案,但我不知道這些功能不能部分專業化,我需要使用類。謝謝! – roohan

+0

使用標籤分發(請參閱http://www.boost.org/community/generic_programming.html#traits),只能通過重載函數實現。我只是認爲部分專業化的解決方案更容易,但隨時可以嘗試標籤調度。爲了達到這個目的,你需要定義兩個標籤結構(每種一個),並在is_Wide_char_type中使用它。 – PiotrNycz

+0

好吧,我今天測試了你的解決方案,它工作正常。現在唯一的問題是wchar_t數組。當我傳遞一個wchar_t [3]例如我必須轉換爲wchar_t *,因爲我無法找到變量數組大小的is_wide_char_type 版本。但其他一切正常。 – roohan