Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对整数类型执行舍入,但不对小数类型执行舍入_C++_Templates_Types - Fatal编程技术网

C++ 对整数类型执行舍入,但不对小数类型执行舍入

C++ 对整数类型执行舍入,但不对小数类型执行舍入,c++,templates,types,C++,Templates,Types,在下面的函数中,我正在寻找一个表达式来替换isIntegral 其目的是,当T是整数类型时,我们在static_-cast之前添加0.5f隐式地降低值(因此我们获得一个舍入值),但当T是分数类型时,我们不添加任何内容,因此static_-cast只能降低精度 T interpolate( T const & prev, T const & next, float interpolation ) { float prevFloat = static_cast< flo

在下面的函数中,我正在寻找一个表达式来替换
isIntegral

其目的是,当
T
是整数类型时,我们在
static_-cast
之前添加
0.5f
隐式地降低值(因此我们获得一个舍入值),但当
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 );
}
T插值(T常量和上一个、T常量和下一个、浮点插值)
{
float-prevFloat=静态施法(prev);
float nextFloat=静态_cast(下一步);
浮点结果=prevFloat+((nextFloat prevFloat)*插值);
返回静态(结果+(isIntegral?0.5f:0.0f);
}

使用
std::numeric\u limits::is\u integer
(它在
标题中)。

使用
std::numeric\u limits::is\u integer
(它在
标题中)。

std::is\u integral::value
如果包含
,大多数编译器现在都支持此功能。

std::is_integral::value
如果包含
,大多数编译器现在都支持这一点。

这应该是可能的(没有任何运行时开销),但需要一些Boost魔法(未测试):

#包括
#包括
样板
typename boost::enable_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T为整型情况的代码
}
样板
typename boost::禁用_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T不是整型的情况下的代码
}
这应该是可能的(没有任何运行时开销),使用一些Boost magic(未测试):

#包括
#包括
样板
typename boost::enable_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T为整型情况的代码
}
样板
typename boost::禁用_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T不是整型的情况下的代码
}

为什么不直接声明
常量浮点加数=0.5f-静态转换(0.5f)
为什么不直接声明
常量浮点加数=0.5f-静态转换(0.5f)

在实践中,编译器应该优化三元表达式(在OP的代码中)通过常数折叠实现零。正确,如果这里的开销可能很大,则使用
enable\u。但是,如果不同类型的代码有很大差异,则该方法非常有用。在实践中,编译器应优化三元表达式(在OP的代码中)通过常量折叠实现零。正确,如果此处可能会出现开销,则使用
enable_。但是,如果不同类型的代码有很大差异,则此功能非常有用。
std::is_integral<T>::value
#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
}