Я пытаюсь расширить класс boost::dynamic_bitset
с некоторой функциональностью, в которой я нуждаюсь, например, подсчитывать биты после операции AND и т. Д. Также мне нужен доступ к частным членам (m_num_bits и т. Д.), Потому что Я хочу иметь возможность «переопределить» метод set()
, чтобы обеспечить емкость битового набора с помощью параметра resize(), если pos
бит для установки больше текущей емкости битов. Если я использую родную set()
ГЕТ это прошлифованной ошибку утверждения в этом случае (поскольку метод set()
не изменяет размер в таком случае)Расширение boost :: dynamic_bitset для добавления некоторой функциональности
Я не очень опытный с шаблонами, а также я просто получаю обратно в C++, так как некоторые из них недели, это немного ржавая, может быть, кто-то может мне помочь.
Я начал делать это:
template <typename Block, typename Allocator>
class ExtendedBitSet : public boost::dynamic_bitset<Block, Allocator> {
typedef boost::dynamic_bitset<Block, Allocator> super;
public:
void set(std::size_t pos) {
if (pos > super::size())
super::resize(pos);
set(pos);
}
bool get(std::size_t pos) const {
return super::test(pos);
}
};
// ...
ExtendedBitSet<> * bs = new ExtendedBitSet<>(128);
bs->set(33);
// ...
std::wcout << "Bit 48 is " << ((bs->get(48) == true) ? "true" : "false") << std::endl;
// ...
delete bs;
Ofcourse это не компиляции ошибка:
dynamic_bitset.cpp: In function ‘int main(int, char**)’:
dynamic_bitset.cpp:50: error: wrong number of template arguments (0, should be 2)
dynamic_bitset.cpp:7: error: provided for ‘template<class T, class Allocator> class ExtendedBitSet’
dynamic_bitset.cpp:50: error: invalid type in declaration before ‘=’ token
dynamic_bitset.cpp:50: error: wrong number of template arguments (0, should be 2)
dynamic_bitset.cpp:7: error: provided for ‘template<class T, class Allocator> class ExtendedBitSet’
dynamic_bitset.cpp:51: error: request for member ‘set’ in ‘* bs’, which is of non-class type ‘int’
..
dynamic_bitset.cpp:57: error: request for member ‘get’ in ‘* bs’, which is of non-class type ‘int’
Может кто-нибудь дать подсказку, как получить, что работает? Кроме того, может быть, лучший способ, чем получение класса dynamic_bitset или это нормально делать?
Любая помощь очень ценится.
Теперь я получаю несколько меньше ошибок, но до сих пор не принимаю создание объекта с размером как 'ExtendedBitSet> * bs = new ExtendedBitSet > (128); ', нужно ли переопределять конструктор базового класса (dynamic_bitset) в производном классе? На данный момент я и ошибка компилятора, которая говорит: 'error: нет соответствующей функции для вызова в ExtendedBitSet > :: ExtendedBitSet (int) ''. Кажется, я что-то пропустил ... –
@ AndreasW.Wylach: Да, вы должны предоставить свои собственные ctors в 'ExtendedBitSet <>'. – wilx
Спасибо, он работает. Также мне интересно, почему 'boost :: dynamic_bitset' не ** или ** биты разной длины, это имеет место в моем приложении, многие биты для OR имеют разную длину. Кажется, что Java Bitset справляется с этим делом. Есть ли причина для этого? –