2015-04-06 2 views
0

Я искал способ вернуть битрейт разного размера с помощью шаблона или чего-то подобного. У меня на самом деле еще не было возможности поиграть с ним слишком много, но мне было просто любопытно, если кто-то когда-либо испортил это раньше, и ему удалось это сделать.Возвращает переменный размер бита

Цель состоит в том, чтобы не записывать 4 функции для 4 разных размеров битов (32, 17, 10, 5). Я думал, что смогу использовать какой-то шаблон для этого (просто поместив шаблон непосредственно в функцию, а не в реализацию класса или что-то в этом роде).

так это будет выглядеть примерно так:

template<something SIZE> 
    static bitset<SIZE> function(bitset<SIZE>); 

Я бы быть в основном проходящим в BitSet размера SIZE, а затем возвращаюсь, что размер BitSet назад после того, как некоторые вещи делаются для него.

Возможно, я мог бы выполнить это с помощью вектора и бросить позже, но у меня возникает ощущение, что есть способ сделать то, что я пытаюсь сделать здесь. Если у кого-то есть мысли, пожалуйста, сообщите мне. Я намерен немного разобраться в этом немного позже и провести некоторое тестирование, поэтому я обновлю это, когда найду некоторые вещи.

Заранее спасибо.

----- Изменить -----

Я пошел вперед и реализовать решение Mark_B, и это, кажется, работает хорошо. Если у кого-то есть другая реализация, я был бы рад ее видеть, но я просто использую шаблон для его реализации.

Спасибо за быстрые ответы.

+0

Знает ли звонящий размер во время компиляции? –

+0

Да, вызывающий абонент знал бы этот размер во время компиляции. Он просто используется как статическая функция для внесения незначительных изменений в биты. В этом случае решение Mark_B кажется эффективным, поэтому я собираюсь пойти с этим в настоящее время. Если у кого-то еще есть другое решение, которое может работать лучше или может работать иначе, я был бы рад услышать его. – Monatrox

ответ

2

std::vector<bool> специализируется так, чтобы в реализациях качества использовалось всего 1 бит на элемент. Это самый близкий к битрейту переменной длины, который предоставляет стандартная библиотека. Помимо этого, вы можете просто сделать это самостоятельно или использовать Boost dynamic_bitset.

+0

Да, я думал об этом, но мне потребовалось бы переписать другие разделы моего кода, которые я уже реализовал с помощью битового набора. Я думаю, я мог бы просто написать функцию для конвертирования туда и обратно, но это, вероятно, приведет меня к той же проблеме (требующей, чтобы я возвращал динамический размер бита). Преобразование «на лету» было бы простым, но мне пришлось бы делать это несколько раз, и мне нравится быть ленивым, когда я знаю, что я буду писать что-то 10 раз в 10 разных местах. – Monatrox

2

Что-то было бы size_t.

template<size_t SIZE> 
bitset<SIZE> function(bitset<SIZE>); 
+0

Я предпочитаю использовать 'ptrdiff_t' или просто' int'. Использование 'size_t' помогает с ошибкой в ​​некоторых более старых версиях g ++. Недостаточно оснований для его использования ИМХО. –

+2

@ Пользователи и hth. - Alf Поскольку тип шаблона 'bitset' is' size_t', вы можете уточнить, почему его не использовать? –

+0

Я думал, что это сработает, но не успел проверить это. Это делает вещи очень простыми. Обычно, когда я использую шаблоны, я реализую их с использованием классов и typedefs в качестве аргументов, поэтому, я думаю, я просто не был уверен, что могу использовать size_t в качестве типа шаблона. После тестирования этого метода он работает отлично. До сих пор не сталкивались с какими-либо проблемами. Спасибо за совет. – Monatrox

Смежные вопросы