Перегрузка операторов сдвига 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

демо на колиру

Другие вопросы по тегам