2010-06-03 41 views
0

我需要寫一個實用程序功能(在我的C++ CLI應用程序),一個字符串轉換爲雙人間或浮動或詮釋。這個鑄件是否安全?

template<typename T> 
static T MyConvert(String^ str) { 
    return static_cast<T>(System::Convert::ToDouble(str)); 
} 

這是安全嗎?
可它在某種程度上轉化爲2〜1.999,然後爲1,如果我叫MyConvert<int>("2")
我想知道爲什麼Convert類不是在第一個模板? (這將讓我叫Convert<T>而不是Convert.ToDouble()所有類型)
這是C++/CLI,所以我可以使用任何轉換在C方法++或.NET,但我只知道Convert.ToDouble()|ToString()|ToInt32())

+0

轉換類不使用泛型。每種類型都有特殊的邏輯,所以使用泛型不會使它更靈活。 – 2010-06-03 14:16:13

+1

有很多原因,這是不安全的。對於初學者來說,如果你的輸入參數不是一個數字,那麼甚至沒有檢查完成。 – 2010-06-03 14:16:29

+0

這不是確切的代碼,我只發佈了我認爲與數值分析相關的東西。字符串不是直接發送這個這個。 – Itsik 2010-06-03 19:06:47

回答

1

這是寫在非方式-CLI環境意味着類似於

template <typename T> 
    T GetValue (const std::string& value) const 
    { 
     T t; 


     try 
     { 
     t = boost::lexical_cast<T>(value); 
     } 
     catch (const boost::bad_lexical_cast&) { 
     // It's horrible! 
     // (...) 
     } 

     return t; 
    } 

請注意,此轉換是有效的,因爲只進行了適當的轉換。 在你的情況下,轉化爲int將意味着調用轉換爲雙(可能,我懷疑是不是普通的轉換成int效率較低)和邪惡的舍入你的static_cast

爲什麼即使這樣做呢?

嘗試與我在示例中使用的方法相同的方法,但移植到CLI。專注你的模板,MyConvert<int>MyConvert<double>電話甚至使兩種不同的方法(因爲寫作模板函數只有適合模板參數是不是來設計應用程序的最佳方式)。

這些方法/模板專業化中的每一個都意味着調用適當的ToYyy例程並返回相應類型的結果。因爲它不僅僅是一個簡單的鑄件更

+0

爲什麼我不能使用相同的確切方法?爲什麼我需要專門化我的模板? – Itsik 2010-06-04 08:56:16

+0

@Itsik只要它不是你的瓶頸,你不會遇到麻煩,你*可以*。但是用這個術語,你也可以*將所有代碼寫入一行(只要它能工作)。這個答案只是我的意見 - 我將如何實現這一點,爲什麼我認爲這會更有效。當然,最後的決定取決於你。 – 2010-06-04 17:05:22

+0

也許我沒有正確理解答案。 GetValue ()對我來說看起來像是一個很好的方法,可以完成工作。我不明白額外的部分,爲什麼我想專門化我的模板,如果我使用GetValue。你是否建議一種替代選擇? – Itsik 2010-06-04 17:20:35