c++ - 重载 std::bitset 的移位运算符

标签 c++ operator-overloading 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>'

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

  • 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 以来,此编译但没有任何效果, unqualified-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

demo on coliru

关于c++ - 重载 std::bitset 的移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452703/

相关文章:

c++ - 在 ROOT 的 THistPainter 类中使用 CONTour 选项时,如何添加色阶?

C++ 二维数组用文件中的最后一个元素值填充所有元素

c++ - TIdAntiFreeze 实现

c++ - 运算符重载 : cannot add two pointers

Javascript:运算符重载

c++ - 更改 std::bitset 中一系列位值的最有效方法

C++:错误:使用空句柄

c++ - 关于运算符+重载

c++ - 从包含十六进制数的 std::string 或 QString 创建 std::bitset 或 QBitArray

c++ - 如何将 std::bitset<N> 转换为 std::bitset<M>?