1

整数型の変数を特定のビットに代入するときに、少し異なる動作をするビットセットが必要です。割り当てられた整数が 1 より小さい場合はビットを 0 に設定し、それ以外の場合は 1 に設定する必要があります。

簡単な解決策として、STL ビットセットをコピーし、クラス名を altbitset に置き換え、名前空間を調整し、ガードを含めreference& operator=(bool __x)、ネストされたreferenceクラスの下に次の関数を追加しました。

template <typename T> 
reference& operator=(T i) {
    if (i<1) return operator=(false);
    return operator=(true);
}

期待どおりに動作します。

問題は、これを行うより良い方法があるかどうかです。

4

1 に答える 1

1

新しい関数を追加するためだけにライブラリをコピーするべきではありません。それだけでなく、新しい関数は非常に直感的ではなく、コードを書くどころか、コードを読むだけでもエラーの原因になる可能性があります。

前:

bv[n] = -1; // I know a Boolean conversion on -1 will take place
assert(bv[n]); // of course, since -1 as a Boolean is true

後:

bv[n] = -1; // I guess an integer < 1 means false?
assert(bv[n]); // Who changed my bitvector semantics?!

ドメインで意味なすように書き出すだけです。

bv[n] = (i < 1);

覚えておいてください: 最も単純であるということは、常に最も文字数が少ないという意味ではなく、最も読みやすいという意味です。


既存の型の機能を拡張したい場合は、無料の関数を使用してください。

template <typename BitSet, typename Integer>
auto assign_bit_integer(BitSet& bits, const std::size_t bit, const Integer integer) ->
    typename std::enable_if<std::is_integral<Integer>::value,
                            typename BitSet::reference>::type
{
    return bits[bit] = (integer < 1);
}

与える:

std::bitset<8> bits;

assign_bit_integer(bits, 0, 5);
// ERROR: assign_bit_integer(bits, 0, 5.5);

しかし、その機能を簡潔に説明する明確な「明白な」名前のないこのような小さな関数の場合 (assign_bit_true_if_less_than_one_otherwise_false控えめに言っても冗長です)、コードを書き出すだけです。とにかく同じことを言います。

于 2013-02-07T19:33:29.663 に答える