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

Overload the shift operators of std::bitset

本文关键字:运算符 bitset std 重载      更新时间:2023-10-16

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

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中遇到错误:

"运算符<<"的行外定义与"bitset<_Size>中的任何声明都不匹配

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

  • Xcode : 版本 9.1 (9B55)
  • LLVM(llvm-g++ -v) : Apple LLVM 版本 9.0.0 (clang-900.0.38)

std::bitset::operator<<=是模板类std::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函数或定义包装器旋转类:

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

关于科里鲁的演示