重载 std::bitset 的移位运算符

Overload the shift operators of std::bitset

我想使用移位运算符进行位旋转 而不是 它们的实际位移。这是我预期的行为:

std::bitset<8> b8("1010"); // b8 = 00001010 
b8 <<= 5;                  // b8 = 01000001

所以我尝试重载 <<= 运算符,引用 bitset 定义,如下所示:

#include <iostream>
#include <bitset>

using namespace std;

template <size_t size>
bitset<size>& bitset<size>::operator<< (size_t pos) noexcept { // an error at here

}

我在关键字 operator 处遇到错误:

Out-of-line definition of 'operator<<' does not match any declaration in 'bitset<_Size>'

我该如何解决?我的环境。是:

std::bitset::operator<<=是模板classstd::bitset的成员函数。您不能重新定义此运算符。你甚至不能用另一个隐藏它:

template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, std::size_t count) noexcept {
    // ...
    return bitset;
}

这可以编译但没有任何效果,因为当您编写 b8 <<= 5 时,不合格 ID 查找会在考虑您的自由函数之前找到 std::bitset::operator<<=

您应该使用另一个运算符,定义一个 rotate 函数,或者定义一个包装器 rotate class:

struct rotate
{
    rotate(std::size_t n) : value(n) {}
    std::size_t value;
};


template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, rotate r) noexcept {
    bitset = bitset << r.value | bitset >> (size-r.value);
    return bitset;
}

用法:

std::bitset<8> b8("1010"); // b8 = 00001010 
b8 <<= rotate(5);          // b8 = 01000001

demo on coliru