模板函数roundTo int,float - >截断

时间:2010-05-14 14:32:18

标签: c++ templates function return

根据这个问题: Calling template function without <>; type inference 我将在未来使用的圆函数现在看起来像:

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 float或long double,它将提供s ***。

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

我在考虑函数的指定重载但是......
这是不可能的......
你怎么解决这个问题?
非常感谢提前 糟糕

3 个答案:

答案 0 :(得分:1)

假设您想要最接近的整数值,请转换为TOut

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

floor也应该作为内部演员的替代品。关键是不要依赖于强制转换为未知类型来执行任何截断 - 确保明确截断,使用floorcast到一个众所周知的整数类型,然后执行返回指定类型所需的进一步投射。

答案 1 :(得分:0)

尝试使用地板:

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

答案 2 :(得分:0)

您可以为非整数返回类型禁用您的函数:

#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 );
}