2013-02-20 335 views
0

我有這樣設置默認值

template <typename BIT_LENGTH> 
class mod { 
public: 
mod(BIT_LENGTH val) : m_val (powl(2,sizeof(BIT_LENGTH) * 8) - 1), _val(val) { 
} 

void value() { 
    std::cout << " sizeof -- " << sizeof(BIT_LENGTH) << std::endl; 
    std::cout << " value is : ---- " << m_val << std::endl; 
    std::cout << " value is : ---- " << _val << std::endl; 
} 
private: 
BIT_LENGTH m_val; 
BIT_LENGTH _val; 

}; 

int main(){ 
mod<uint64_t> mod1(10); 
mod1.value(); 
} 

一個示例代碼現在我想將成員變量初始化爲模板化類型的最大值。

什麼是最好的方法來做到這一點?

比使用powl函數更乾淨嗎?

回答

2

檢出std::numeric_limits


powl是不是一個標準的C++函數:從linux的。哦,它在C99中。好吧!在C++中,基本上只有名稱爲pow的函數具有相同的功能,但有一個超載(在C++ 11標準中沒有提到powl)。


順便說一下,通過爲宏名保留ALL UPPERCASE,您可以(統計地)避免令人討厭的意外文本替換。它的眼睛也更容易。一般來說。另外,如果你不知道,在C和C++中,一個字節不能保證是8位。如果你不知道,在C和C++中,一個字節不能保證是8位。在某些平臺上,特別是某些德州儀器的數字信號處理器,一個字節(例如char)是16位。歷史上它也是其他尺寸。它必須是至少 8位,但就是這樣。每個字節的位數可以從<limits.h>得到CHAR_BIT


最後,如果你總是使用系統縮進你會發現,你得到一個更好的理解代碼。

而且別人也會更容易理解代碼。

而且幾乎神奇的是,這導致大量減少錯誤數量,您必須花時間搜尋和糾正錯誤。

1
#include <limits> 

std::numeric_limits<BIT_LENGTH>::max() 

如果BIT_LENGTH是內置類型,則會執行此操作。順便說一下,這對於數據類型來說是一個非常令人誤解的名稱。