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++ では、本質的に同じ関数がpowオーバーロードである という名前で利用できます (不思議なことpowlに、C++11 標準では言及されていません)。


ところで、(統計的に) マクロ名にすべて大文字を予約することで、迷惑な意図しないテキスト置換を避けることができます。また、目にもはるかに簡単です。一般に。


また、ご存じないかもしれませんが、C および C++ では、1 バイトが 8 ビットであることが保証されていません。一部のプラットフォーム、特に一部の Texas Instruments デジタル シグナル プロセッサでは、1 バイト (acharなど) は 16 ビットです。歴史的には、他のサイズもありました。少なくとも8ビットでなければなりませんが、それだけです。1 バイトあたりのビット数は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 に答える