簡體   English   中英

將C ++整數類型模板參數轉換為“較長”整數類型

[英]Convert a C++ integral type template parameter to a “longer” integral type

我有一個模板函數,可以接受整數類型,並對兩個輸入參數執行數學運算:

template<typename T, typename R>
R multiply( const T& lhs, const T& rhs ) {
  R ans = static_cast<R>( lhs ) * static_cast<R>( rhs );
  return ans;
}

(為簡單起見,假設類型T和R始終是無符號整數類型,或者我進行了適當的檢查以確保這一點。)

在這個人為的示例中,您可以看到我正在做一個簡單的乘法(僅用於說明)。 這個想法是要傳遞一個類型R,它是類型T的兩倍多; 這將使整個產品適合返回值:

uint64_t Product64 = multiply<uint32_t,uint64_t>( 0xFFFFFFFF, 0xFFFFFFFF );
uint16_t Product16 = multiply<uint8_t,uint16_t>( 0xFF, 0xFF );

我想知道是否有任何方法可以免除第二個模板參數 ,並在編譯時 自動計算至少為T型的[多於兩倍]的類型。

注意:對於R始終僅使用最大的可用整數類型(uint64_t)並不是我的解決方案。 理想情況下,我需要一個編譯時計算的類型,該類型應足夠大以容納兩倍於類型T的位(例如,當T = uint8_t,R = uint16_t時)。

在我看來,使用limit或type_traits或類似的東西應該可以實現,但是到目前為止我還沒有想到解決方案。 C ++ 11或更高版本是可以的。 我寧願避免使用Boost,但是如果那是唯一的方法,那么我也希望看到基於Boost的解決方案。

您可以創建自己的模板大小類型,並使用它們來定義您的返回類型,如下所示:

#include <cstdint>
template<int N>
struct sized_uint {};
template<> struct sized_uint<8 > { using type=std::uint8_t; };
template<> struct sized_uint<16> { using type=std::uint16_t; };
template<> struct sized_uint<32> { using type=std::uint32_t; };
template<> struct sized_uint<64> { using type=std::uint64_t; };

#include <climits>
template<typename T>
auto multiply(T lhs, T rhs)
{
  using R=typename sized_uint<CHAR_BIT*sizeof(T)*2>::type;
  return static_cast<R>(static_cast<R>(lhs) * static_cast<R>(rhs));
}

現場觀看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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