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 功能更清洁的吗?

4

2 回答 2

2

退房std::numeric_limits


powl不是标准的 C++ 函数:它来自 Linux。哦,它在 C99 中。那好吧!在 C++ 中,本质上相同的函数只提供 name pow,一个重载(奇怪powl的是在 C++11 标准中没有提到)。


顺便说一句,您可以(从统计上)通过为宏名称保留 ALL UPPERCASE 来避免烦人的意外文本替换。它也更容易在眼睛上。一般来说。


此外,以防万一您不知道,在 C 和 C++ 中,不能保证一个字节为 8 位。在一些平台上,特别是一些德州仪器数字信号处理器,一个字节(例如 a char)是 16 位。从历史上看,它也有其他尺寸。它必须至少为8 位,仅此而已。每个字节的位数可CHAR_BIT<limits.h>.


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

这也让其他人更容易理解代码。

几乎神奇的是,这大大减少了您必须花时间寻找和纠正的错误数量。

于 2013-02-20T06:42:01.620 回答
1
 #include <limits>

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

如果BIT_LENGTH是内置类型,将执行此操作。顺便说一句,这是一个非常容易误导数据类型的名称。

于 2013-02-20T06:42:09.960 回答