设置默认值
问题描述:
我有这样设置默认值
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
。
哦,它在C99中。好吧!在C++中,基本上只有名称为powl
是不是一个标准的C++函数:从linux的。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
是内置类型,则会执行此操作。顺便说一下,这对于数据类型来说是一个非常令人误解的名称。