簡體   English   中英

模板專業化或功能重載

[英]Template Specialization or Function Overloading

我知道還有其他類似問題,但它們不是很清楚。

現在,我覺得這似乎是一個愚蠢的問題,因為我確定我已經有了答案,但是無論如何我還是要問。

所以我基本上有一個函數,它接收一個字符串,然后根據適當的變量類型將其轉換為:

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

所以這似乎是正確的嗎? 但問題是您無法將字符串轉換為int或float,因此我將不得不對int和float以及其他無法轉換為其他類型的模板進行特殊化處理,所以我要問的是像這樣的東西:

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) { ... }

..等等

還是應該使用模板專業化? 哪一個更有意義? 我傾向於函數重載,因為大多數類型都將具有自己的轉換函數,因此由於它們略有不同,函數重載對我來說是合乎邏輯的,但我不知道我是否缺少某些東西。

我應該堅持使用函數重載嗎? 還是切換到模板專業化?

如果每種類型的函數內部都必須不同並且可能包括類型檢查,則擁有多個函數會更簡單,更簡潔。

另一方面,如果您有一堆帶有toString()方法進行轉換的類。 然后,您將使用模板,因為內部構造將始終相同。

我會用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;
}

這應該是您的問題的答案:

如何在C ++中獲取typeof變量

是的,應該是模板專業化。

簡短答案

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


長答案

功能庫模板專業是2類公民,功能是1類公民。

如果編寫重載函數,則任何人都無法編寫任何重載或隱藏代碼而不會出現編譯器錯誤的情況。 如果編寫函數基礎模板專業化,則任何人都可以使用與該函數基礎模板專業化簽名相匹配的函數重載對其進行重載。 (是的,寫專業化的程序員會很討厭您的功能,但必須忍受這一點)。

如果您想要一個更好的問題以獲得更好的答案,請閱讀為什么不專門研究功能模板? http : //www.gotw.ca/publications/mill17.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM