2010-06-03 38 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