функция шаблона roundTo int, float -> усечение - PullRequest
3 голосов
/ 14 мая 2010

по этому вопросу: Вызов функции шаблона без <>; вывод типа функция округления, которую я буду использовать в будущем, теперь выглядит так:

template < typename TOut, typename TIn >
TOut roundTo( TIn value ) {
   return static_cast<TOut>( value + 0.5 );
}
   double d = 1.54;
   int i = rountTo<int>(d);

Однако это имеет смысл только в том случае, если он будет использоваться для округления до целочисленных типов данных, таких как char, short, int, long, long long int и его аналоги без знака. Если он когда-либо будет использоваться с плавающим или длинным двойным TOut As, то получится s ***.

double d = 1.54;
float f = roundTo<float>(d);
// aarrrgh now float is 2.04;

Я думал об определенной перегрузке функции, но ...
это невозможно ...
Как бы вы решили эту проблему?
большое спасибо заранее
К сожалению

Ответы [ 3 ]

1 голос
/ 14 мая 2010

Предполагая, что вам нужно ближайшее целочисленное значение, приведите к TOut,

static_cast<TOut>( static_cast<long long>(value + 0.5) );

floor также должно работать как альтернатива внутреннему составу. Смысл заключается не в том, чтобы полагаться на приведение к неизвестному типу для выполнения какого-либо усечения - убедитесь, что усечение явно, с floor или cast до общеизвестного целочисленного типа, затем execute При дальнейшем приведении нужно вернуть указанный тип.

0 голосов
/ 14 мая 2010

Вы можете отключить вашу функцию для нецелых возвращаемых типов:

#include <boost/type_traits.hpp>
#include <boost/utility.hpp>

template < typename TOut, typename TIn >
typename boost::enable_if<boost::is_integral<TOut>, TOut>::type roundTo( TIn value ) {
   return static_cast<TOut>( value + 0.5 );
}
0 голосов
/ 14 мая 2010

Попробуйте использовать пол:

template < typename TOut, typename TIn >
TOut roundTo( TIn value ) {
   return static_cast<TOut>(floor( value + 0.5 ));
}

double d = 1.54;
int i = rountTo<int>(d);
double d = 1.54;
float f = roundTo<float>(d);
...