重载 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
中遇到错误:
"运算符<<"的行外定义与"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
关于科里鲁的演示
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 重载 std::bitset 的移位运算符
- 对于类型"vector<bitset<8>>"c++ 没有可行的重载运算符[]
- 更改/添加 STL Bitset 的行为<>::引用::运算符=(整数)