2011-05-25 82 views
1

即時嘗試編寫一個uint128_t庫和我的命中碰撞:我需要操作不同類型的整數,例如uint128_t^uint64_t。我寫過運算符重載,如template <typename t> uint128_t operator^(T val)。我也需要能夠做到uint128_t^uint128_t。但是,因爲我的uint128_t使用2個uint64_t來存儲值,所以我不能簡單地使用uint128_t作爲T.因此,我寫了2個不同的函數,一個用T作爲參數類型,另一個用uint128_t作爲類型。使用模板時選擇正確的相等運算符

問題是,編譯器使用標準C++ int類型和uint128_t的T val版本。我如何讓編譯器區分它們?

編輯:我有這樣的代碼在類中的鏈接:

template <typename T> 
bool operator==(T val){ 
    return (LOWER == (uint64_t) val); 
} 

bool operator==(uint128_t val){ 
    return ((UPPER == val.upper()) && (LOWER == val.lower())); 
} 

,如果我做

uint128_t a(5), b(123, 45); 
uint64_t c = 6; 

(a == c); 
(a == b); 

兩條線將使用頂級運營商。然而,由於uint128_t是2部分,並且是一個對象,所以計算機將比較uint64_t與類,而不是值。我如何強制計算機使用第二個==運算符?

+2

一些示例代碼將非常有用 – GWW 2011-05-25 04:24:37

+2

您確定在這兩種情況下都會使用頂級版本嗎?比較兩個uint128_t時,C++的重載解析應該總是比模板版本更喜歡確切的非模板函數。 – templatetypedef 2011-05-25 04:35:32

+0

這就是它似乎在做什麼。即時通訊仍在檢查... – calccrypto 2011-05-25 04:48:07

回答

1

除了轉換構造函數外,您甚至不需要額外的重載。然後你只需編寫處理uint128_t的運算符,並且如果嘗試傳遞另一個可轉換類型(如int),則將使用轉換構造函數轉換它,然後調用相應的運算符。

看到,這個作品:

#include <cstdint> 
#include <iostream> 

class uint128_t{ 
    private: 
     uint64_t UPPER, LOWER; 

    public: 
    // constructors 
     uint128_t(){ 
      UPPER = 0; 
      LOWER = 0; 
     } 

     template <typename T> 
     uint128_t(T val){ 
      UPPER = 0; 
      LOWER = (uint64_t) val; 
     } 

     template <typename S, typename T> 
     uint128_t(const S & upper_val, const T & lower_val){ 
      UPPER = (uint64_t) upper_val; 
      LOWER = (uint64_t) lower_val; 
     }  

     uint64_t upper() const{ 
      return UPPER; 
     } 

     uint64_t lower() const{ 
      return LOWER; 
     } 

     uint128_t & operator+=(const uint128_t & rhs) 
     { 
      uint64_t old_lower = LOWER; 
      LOWER += rhs.LOWER; 
      if(LOWER < old_lower) 
       ++UPPER; 
      UPPER += rhs.UPPER; 
      return *this; 
     } 
}; 

bool operator==(const uint128_t & lhs, const uint128_t & rhs){ 
    return ((lhs.upper() == rhs.upper()) && (lhs.lower() == rhs.lower())); 
} 

int main() 
{ 
    uint128_t v(25); 
    v += 25; 
    int c = 50; 
    if(v == c) 
     std::cout << "Good"; 
    if(v == c + 1) 
     std::cout << "Bad"; 
} 

http://ideone.com/BEq03

1

嘗試採取模板運營商出類,並使其全球,然後指定你所需要的特定的轉換,即:

template<typename T> 
bool operator==(uint128_t v1, T v2) 
{ 
    return (v1.lower() == (uint64_t) v2); 
} 

template<> 
bool operator==(uint128_t v1, uint128_t v2) 
{ 
    return ((v1.upper() == v2.upper()) && (v1.lower() == v2.lower())); 
}