根据c ++中的数据类型设置默认值

时间:2013-02-20 06:39:55

标签: c++ c templates

我有一个示例代码,如

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 个答案:

答案 0 :(得分:2)

结帐std::numeric_limits


powl不是标准的C ++函数:它来自Linux。哦,它就在C99中。那好吧!在C ++中,基本上只有名为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是内置类型,

将执行此操作。顺便说一下,这对于数据类型来说是一个非常具有误导性的名称。