Расширьте boost:: dynamic_bitset, чтобы добавить некоторые функции.

Я пытаюсь расширить класс boost::dynamic_bitset некоторыми необходимыми мне функциями, такими как подсчет битов после операции AND и т. д. Также мне нужен доступ к закрытым членам (m_num_bits и т. д.), потому что я хочу иметь возможность «переопределить» метод set() чтобы обеспечить емкость битового набора с помощью функции resize(), если pos устанавливаемого бита больше, чем текущая емкость битового набора. Если я использую собственный set() fct, в этом случае возникает ошибка утверждения (поскольку метод set() в таком случае не изменяет размер)

Я не очень разбираюсь в шаблонах, также я только что вернулся к 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;

Конечно, это не компиляция, ошибка:

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, или это нормально?

Любая помощь приветствуется.


person Andreas W. Wylach    schedule 12.07.2012    source источник


Ответы (1)


Ваш ExtendedBitSet<> не имеет параметров по умолчанию для параметров типа шаблона, и ваш код пытается создать его экземпляр, не указывая их явно. Попробуйте вместо этого использовать ExtendedBitSet<unsigned, std::allocator<unsigned> > bs.

person wilx    schedule 12.07.2012
comment
Теперь я получаю несколько меньше ошибок, но по-прежнему не принимаю создание объекта с размером ExtendedBitSet<unsigned, std::allocator<unsigned> > * bs = new ExtendedBitSet<unsigned, std::allocator<unsigned> >(128);. Нужно ли мне переопределять конструктор базового класса (dynamic_bitset) и в производном классе? На данный момент я обнаружил ошибку компилятора, которая говорит: error: no matching function for call to ‘ExtendedBitSet<unsigned int, std::allocator<unsigned int> >::ExtendedBitSet(int)’. Кажется, я что-то где-то упустил... - person Andreas W. Wylach; 12.07.2012
comment
@AndreasW.Wylach: Да, вы должны предоставить свои собственные ctors в ExtendedBitSet<>. - person wilx; 12.07.2012
comment
Спасибо, запустил. Также мне интересно, почему boost::dynamic_bitset не выполняет ИЛИ наборы битов разной длины, это имеет место в моем приложении, многие наборы битов должны быть объединены ИЛИ разной длины. Java Bitset, похоже, справляется с этим случаем. Есть ли причина для этого? - person Andreas W. Wylach; 13.07.2012