簡體   English   中英

C ++模板函數可比較任何無符號和有符號整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM