2013-04-30 113 views
0

我知道還有其他類似的問題,但他們不是很清楚。模板專業化或功能超載

現在我覺得這是一個愚蠢的問題,因爲我確定我已經有了答案,但是讓我反問。

所以我基本上有一個函數,它在一個字符串,然後基於它轉換它,像這樣適當的變量類型:

template<class T> 
void ConvertValue(std::string str, T &variable) 
{ 
    variable = static_cast<T>(str); 
} 

因此這似乎是罰款是否正確?但事情是,你不能轉換一個字符串來說一個int或一個浮點數,所以我將不得不爲整數和浮點數和其他類型,它不能轉換爲模板特化,所以我問的是我應該是這樣的:

void ConvertValue(std::string str, int &variable) { variable = atoi(str.c_str()); } 
void ConvertValue(std::string str, float &variable) { ... } 
void ConvertValue(std::string str, double &variable) { ... } 
void ConvertValue(std::string str, std::vector<int> &variable) { ... } 

...等

,或者我應該使用模板特殊化?哪一個會更有意義?我傾向於函數重載,因爲大多數類型都會有自己的轉換函數,因爲它們略微不同,函數重載對我來說是合乎邏輯的,但我不知道我是否錯過了某些東西。

我應該堅持功能重載嗎?或切換到模板專業化?

+1

我不會假設static-casting一個by-val的'std :: string'到任意一個帶有* work *的類型變量,更不用說「很好」。但是你可以在strstream的幫助下完成你想要的任務。 – WhozCraig 2013-04-30 23:01:32

+0

這似乎是一件奇怪的事情。如果你說,將字符串轉換爲列表,你會發生什麼?清單?一個列表與每個條目的字符串之一?這將如何處理用戶創建的對象?似乎stringstream應該照顧標準整數,浮點數等......如果需要的話,也許是模板化的容器版本。但是你希望在這裏完全達到什麼目的? – 2013-04-30 23:03:09

回答

1

如果函數的內部將不得不爲每個類型不同而且可能包含類型檢查,那麼只有多個函數會更簡單和更清晰。

另一方面,如果您有一堆帶有toString()方法的類進行轉換。那麼你會使用一個模板,因爲內部將永遠是相同的。

+0

+1表示如果代碼重用是主要目標,則建議使用模板。 – 2013-04-30 23:03:37

+0

好吧,我認爲非常感謝您的澄清 – CodingMadeEasy 2013-04-30 23:05:01

0

我會用std::istringstream

template <typename T> 
T ConvertValue(const std::string& str) 
{ 
    std::istringstream iss(str); 

    T ret; 
    if (!(iss >> ret)) 
    { 
     throw std::bad_cast("Failed!"); 
    } 

    return ret; 
} 
0

簡短的回答

你是對的。函數重載更有意義。功能庫模板專業化不會超載


長的答案

功能基本模板專業有2類公民,函數是一等公民。

如果你編寫一個重載函數,沒有人可以編寫任何重載或隱藏你的代碼而不會發生編譯錯誤。如果你寫了一個函數庫模板專業任何人都可以用一個函數重載匹配函數庫模板專業簽名來重載它。 (是的,編寫專業化的程序員會對你的功能感到憤怒,但必須忍受這一點)。

如果您想要更好的問題獲得更好的答案,請閱讀爲什麼不專門設計功能模板?http://www.gotw.ca/publications/mill17.htm