设置默认值

问题描述:

我有这样设置默认值

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函数更干净吗?

检出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


最后,如果你总是使用系统缩进你会发现,你得到一个更好的理解代码。

而且别人也会更容易理解代码。

而且几乎神奇的是,这导致大量减少错误数量,您必须花时间搜寻和纠正错误。

#include <limits> 

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

如果BIT_LENGTH是内置类型,则会执行此操作。顺便说一下,这对于数据类型来说是一个非常令人误解的名称。