2013-01-31 24 views
0

我想以下形式如果需要,我如何安全地在任何带剪裁的数字类型之间进行投射?

template <typename T, typename U> 
U clipAndCast(T x) 
{ 
    ... 
    return y; 
}, 

其中y为x铸造到U型的功能,但其中x如果需要的话,使得本铸件良好定义的削波。

是否有一个库或增强功能呢?我找不到一个,所以如果不是,写出这样一个函数的最好方法是什么?

+0

我不确定你的意思是剪裁?你能举个例子说明你会传递什么吗?也不知道为什么你会在这种情况下使用T和U. –

+0

例如,如果将一个float转换为一个无符号字符,所有值<0将产生0的输出,而所有> 255的值将产生值255. – theotherphil

+0

这是关于**转换**,而不是**转换* *。 –

回答

1

要做到这一点的方法是测试进入的值是否大于或等于外出类型的最小值并且小于或等于外出类型的最大值。您可以使用std::numeric_limits<U>::min()std::numeric_limits<U>::max()来获取最小值和最大值。

+0

要测试x> std :: numeric_limits :: max(),是否不需要先将x转换为U类型的值? – theotherphil

+0

不,比较会执行通常的算术升级,因此较小的类型会被提升为较大的类型以进行比较(但要小心混合无符号和有符号的类型)。 –

相关问题