1

在将整数类型的变量分配给特定位时,我需要一个行为略有不同的位集。如果分配的整数小于 1,则该位应设置为零,否则应设置为 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 回答