这个铸件安全吗?

时间:2010-06-03 14:12:29

标签: casting c++-cli

我需要编写一个Util函数(在我的c ++ cli应用程序中),它将String转换为Double或Float或Int。

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

这样安全吗? 如果我拨打MyConvert<int>("2"),它能以某种方式将2转换为1.999然后转换为1吗? 我想知道为什么Convert类首先没有模板化? (那样我就可以拨打Convert<T>代替所有类型的Convert.ToDouble()了 这是C ++ / Cli所以我可以在c ++或.net中使用任何转换方法,但我只知道Convert.ToDouble()|ToString()|ToInt32())

1 个答案:

答案 0 :(得分: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意味着调用转换为double(可能,并且我怀疑效率低于普通转换为int)以及static_cast的恶意舍入。

为什么甚至倾向于这样做?

尝试与我在示例中使用的方法相同的方法,但移植到CLI。专门为MyConvert<int>MyConvert<double>调用创建模板,甚至制作两个单独的方法(因为只使用两个合适的模板参数编写模板函数不是最好的方法设计你的应用程序)。

这些方法/模板特化中的每一个都意味着调用适当的ToYyy例程并返回相应类型的结果。