Перегрузка операторов сдвига 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>"
Как я могу это исправить? Мой env. является:
- Xcode: версия 9.1 (9B55)
- LLVM (
llvm-g++ -v
): Apple LLVM версия 9.0.0 (clang-900.0.38)
1 ответ
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
поиск по безусловному идентификатору 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