私が書いたら、
int a=10,b=12;
int sub = b-a;
std::bitset<8*sub> bits(bitMask);
それは私に言うエラーを与えています
エラー C2975: '_Bits': 'std::bitset' のテンプレート引数が無効です。コンパイル時の定数式が必要です
このエラーを解決するにはどうすればよいですか。実行時にビットセットを初期化したいのですが、可能ですか? またはこれを行う他の方法はありますか?
テンプレート パラメーターは、コンパイル時の定数でなければなりません。テンプレートをコード ジェネレーターと考えてください。コンパイルを開始する前に、コードを生成する必要があります。「実行時に」テンプレートを使用することはできません!
const unsigned int size = 10;
std::bitset<size> b; // fine, the compiler knows what "size is"
unsigned int n; cin >> n;
std::bitset<n> c; // doesn't make sense!
最初のステップとしてconst
、コード内で可能な限り多くのことを記述する必要があります。実際にはコンパイル時の定数がありますが、そのように宣言していない可能性があります。
動的なサイズのデータ構造が本当に必要な場合は、別のものを使用する必要があります (たとえば、符号なし char のベクトルとビット単位のアクセサ関数)。
これは、文字のベクトルとして設定されたビットの非常に単純な実装です。私はこれをクラスにラップしていません。必要に応じてそれを行うことができます:
std::vector<unsigned char> data;
bool getBit(size_t n, const std::vector<unsigned char> & data)
{
if (data.size() * CHAR_BIT) <= n) return 0;
return data[n / CHAR_BIT] & (1U << (n % CHAR_BIT));
}
void setBit(size_t n, std::vector<unsigned char> & data)
{
if (data.size() * CHAR_BIT) <= n) data.resize(n / CHAR_BIT + 1, 0);
data[n / CHAR_BIT] |= (1U << (n % CHAR_BIT));
}
// Exercise for the reader
void clrBit(size_t n, std::vector<unsigned char> & data);
void tglBit(size_t n, std::vector<unsigned char> & data);
あなたの質問に対する標準の回答はstd::vector<bool>
、そのサイズに動的に対応できるビットセットである を使用することです。
これは、最もメモリ効率の良い方法でビットを格納できる特殊化でstd::vector<bool>
あることを覚えておいてください。(これがひどい理由です:他の s のように動作しません。実数の が必要な場合は、できません。)std::vector
std::vector<T>
T
std::vector
bool
インターフェイスは と同一に保たれますstd::bitset
(これもひどいです。 を使用してvector
インスタンス化すると、汎用コードを使用すると地獄が壊れてしまうためbool
)、既存のコードが壊れてはなりません。
特殊化は、次のstd::vector<bool>
標準で非推奨になります。すでに C++0x を使用している場合、正しい代替手段はstd::dynamic_bitset
. 現在の C++ 標準に固執している場合は、それstd::vector<bool>
が必要です。
必要な場合に使用できboost::dynamic_bitset
ます... 動的ビットセット (私は知っています、クレイジーですよね?)。
boost::dynamic_bitset<> bits(8 * sub, bitMask);
あなたの場合、const
そこに a を貼り付けることができるので、それはconstexpr
:
const int a=10,b=12;
const int sub = b-a;
std::bitset<8*sub> bits;
(コメントより) 実行時にビットセットを初期化することはできません。それがテンプレート引数、またはコンパイル時の定数である理由です
std::vector
別の方法は、いくつかのカスタム アクセス関数を使用してクラスにラップされた bool のa を使用することです。