Выполняем округление по целочисленному, а не дробному типу - PullRequest
1 голос
/ 16 ноября 2010

В следующей функции я ищу выражение для замены isIntegral<T>.

Намерение состоит в том, что, когда T является целочисленным типом, мы добавляем 0.5f до того, как static_cast косвенно укажет значение(и таким образом мы получаем округленное значение), но когда T является дробным типом, мы ничего не добавляем, и поэтому static_cast может только снизить точность.

T interpolate( T const & prev, T const & next, float interpolation )
{
    float prevFloat = static_cast< float >( prev );
    float nextFloat = static_cast< float >( next );

    float result = prevFloat + ( (nextFloat-prevFloat) * interpolation );

    return static_cast< T >( result + ( isIntegral<T> ? 0.5f : 0.0f );
}

Ответы [ 4 ]

9 голосов
/ 16 ноября 2010

Используйте std::numeric_limits<T>::is_integer (это в заголовке <limits>).

2 голосов
/ 16 ноября 2010

Почему бы просто не объявить const float addend = 0.5f - static_cast<T>(0.5f)

0 голосов
/ 16 ноября 2010

Это должно быть возможно (без каких-либо затрат времени выполнения) с некоторой магией повышения (не проверено):

#include <boost/type_traits/is_integral.hpp>
#include <boost/utility/enable_if.hpp>
template<typename T>
typename boost::enable_if<boost::is_integral<T>, T>::type
interpolate(const T& prev, const T& next, float interpolation) {
    // code for the case that T is an integral type
}
template<typename T>
typename boost::disable_if<boost::is_integral<T>, T>::type
interpolate(const T& prev, const T& next, float interpolation) {
    // code for the case that T is not an integral type
}
0 голосов
/ 16 ноября 2010
std::is_integral<T>::value

Если вы включите <type_traits>, большинство компиляторов поддерживают это сейчас.

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