[英]C++ template function to compare any unsigned and signed integers
我想實現一個模板函數,比較兩個類型(T1和T2)的兩個變量。 這些類型是兩種隨機的無符號或有符號整數類型。
為了能夠正確比較它們,我需要將它們都轉換為“更大”的整數類型(T3)。 不幸的是,有符號/無符號比較的升級規則總是升級為無符號類型。
那么,如何在C ++ 11 / C ++ 14 / C ++ 17中找到涵蓋兩個整數類型T1和T2的T3類型,無論它們具有什么大小和符號? 如果無法做到這一點,是否還有其他解決方案來構建基於模板的比較函數,該函數可以可靠地與任何整數組合一起使用?
您可以將比較分為幾部分。 首先檢查一個數字是否為負數,另一個是否為正數。 如果是這樣,您就知道它們的順序。如果兩個都不是負數(或兩個都是負數),則只需進行常規比較即可。
可以在模板函數中構建該模板函數,該模板函數僅檢查簽名類型是否為負。
我不確定我是否理解您的問題。 您的意思是這樣的嗎:
#include <cstdint>
#include <type_traits>
template < typename P, typename Q >
auto
compare( P p, Q q ) {
using T = typename std::common_type< P, Q >::type;
T promoted_p{p};
T promoted_q{q};
if ( promoted_p < promoted_q ) {
return -1;
}
else if ( promoted_p > promoted_q ) {
return 1;
}
else {
return 0;
}
}
如果可以的話,它將可以正常工作;如果該語言沒有滿足您的要求,則可以添加您的專業化知識 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.