我想以下形式如果需要,我如何安全地在任何帶剪裁的數字類型之間進行投射?
template <typename T, typename U>
U clipAndCast(T x)
{
...
return y;
},
其中y爲x鑄造到U型的功能,但其中x如果需要的話,使得本鑄件良好定義的削波。
是否有一個庫或增強功能呢?我找不到一個,所以如果不是,寫出這樣一個函數的最好方法是什麼?
我想以下形式如果需要,我如何安全地在任何帶剪裁的數字類型之間進行投射?
template <typename T, typename U>
U clipAndCast(T x)
{
...
return y;
},
其中y爲x鑄造到U型的功能,但其中x如果需要的話,使得本鑄件良好定義的削波。
是否有一個庫或增強功能呢?我找不到一個,所以如果不是,寫出這樣一個函數的最好方法是什麼?
要做到這一點的方法是測試進入的值是否大於或等於外出類型的最小值並且小於或等於外出類型的最大值。您可以使用std::numeric_limits<U>::min()
和std::numeric_limits<U>::max()
來獲取最小值和最大值。
要測試x> std :: numeric_limits :: max(),是否不需要先將x轉換爲U類型的值? – theotherphil
不,比較會執行通常的算術升級,因此較小的類型會被提升爲較大的類型以進行比較(但要小心混合無符號和有符號的類型)。 –
我不確定你的意思是剪裁?你能舉個例子說明你會傳遞什麼嗎?也不知道爲什麼你會在這種情況下使用T和U. –
例如,如果將一個float轉換爲一個無符號字符,所有值<0將產生0的輸出,而所有> 255的值將產生值255. – theotherphil
這是關於**轉換**,而不是**轉換* *。 –