It would be greatly appreciated if a greatly revamped std::bitset became part of the next Standard.
In my opinion, std::bitset<N> is not some "dumb" bit container, but should be treated as a packed representation of a std::set<int> with max_size() == N, and boost::dynamic_bitset<Alloc> can be viewed as a packed representation of a std::set<int, Alloc>. The various bitwise and/or/xor operators of std::bitset can be viewed as optimized versions of std::set_intersection/std::set_union/std::set_symmetric_difference, and the bitwise shift operators are optimized versions of std::transform with a lambda that adds / subtracts an integer to all set members. The bit-level getters/setters are then equivalent to the insert/erase interface of std::set<int>.
Taking this level of abstraction even further, libstdc++ (and boost::dynamic_bitset) define Find_first_ and Find_next_ member function, which can be adapted to serve as bidirectional proxy-const_iterators (where operator* yields a proxy-const_reference with an implicit conversion to int). These proxy iterators/references are not true iterators and can therefore fail as usual in expressions that require multiple user-defined conversions. But they do not suffer from most of the other problems of std::vector<bool>::iterator because they are const. (they also differ from std::vector<bool>::iterators in that std::bitset<N>::iterator only iterates over 1-bits, skipping the 0-bits).
With that extra level of abstraction, a std::bitset would satisfy the same invariant as std::set<int>. E.g. std::is_sorted(begin(b), end(b)) would be true for every std::bitset b. Conversion to / from any other container or iostream also becomes very easy: std::copy(begin(vec), end(vec), std::inserter(bs, begin(bs)) just works. They also automatically work with Boost.Range. It gives the same convenience and performance for std::bitset as Howard Hinnant did for std::vector<bool> in libc++ (
http://isocpp.org/blog/2012/11/on-vectorbool).
I have successfully implemented such a bitset with all constructors and bit-level getters/setters as constexpr, as well as bidirectional iterators and the full std::set<int> interface, along with non-member algorithm functions that encapsulate the various bit-twiddling routines (
http://tinyurl.com/oshuckp). My application is to use this in a boardgame engine to efficiently manipulate the board state (most of the top-level computer chess programs do similar things with raw 64-bit integer bit-twiddling and could use the same high-level abstraction).
If there is sufficient interest in this stuff, I could write a proper documentation and try to submit this to Boost or as a draft proposal.