Безопасен ли этот кастинг? - PullRequest
0 голосов
/ 03 июня 2010

Мне нужно написать функцию Util (в моем приложении на c ++ cli), которая преобразует String в Double или Float или Int.

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())

1 Ответ

1 голос
/ 03 июня 2010

То, как это написано в среде без 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 и возврат результата соответствующего типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...