我有一个示例代码,如
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功能更干净吗?
答案 0 :(得分:2)
结帐std::numeric_limits
。
哦,它就在C99中。那好吧!在C ++中,基本上只有名为powl
不是标准的C ++函数:它来自Linux。pow
的函数可用,过载(奇怪的是powl
在C ++ 11标准中没有提到。)
顺便说一下,您可以(统计上)通过为宏名称保留所有大写来避免恼人的非预期文本替换。它的眼睛也更容易。总的来说。
另外,如果你不知道,在C和C ++中,一个字节不能保证是8位。在某些平台上,特别是一些德州仪器的数字信号处理器,一个字节(例如char
)是16位。从历史上看,它也有其他尺寸。它必须至少 8位,但就是这样。每个字节的位数可从CHAR_BIT
<limits.h>
获得{{1}}。
最后,如果你总是使用系统的缩进,你会发现你对代码有了更好的理解。
而且其他人也会更容易理解代码。
而且几乎神奇地说,这会导致你花在寻找和纠正上的错误数量大大减少。
答案 1 :(得分:1)
#include <limits>
std::numeric_limits<BIT_LENGTH>::max()
如果BIT_LENGTH
是内置类型,将执行此操作。顺便说一下,这对于数据类型来说是一个非常具有误导性的名称。