беззнаковый шаблон смены в C ++ - PullRequest
4 голосов
/ 11 июня 2011

Я хотел бы сделать беззнаковый сдвиг в C ++.Вот мой пример кода.Проблема в том, что это не универсально.Этот код полностью неверен.Он не будет работать на long и не будет работать на меньших типах, таких как char.Я пытался (unsigned T), но это синтаксическая ошибка.Как я могу сделать этот универсальный без специализации?

#include <cassert>
template<class T>
T unsigned_shift(const T&t, int s) { return ((unsigned int)t)>>s; }
int main()
{
    assert(unsigned_shift(-1, 2)==(-1u>>2));
    assert(unsigned_shift((char)-1, 2)==64);
}

Ответы [ 2 ]

6 голосов
/ 11 июня 2011

Если вы можете использовать Boost , библиотека type_traits имеет шаблон make_unsigned, который бы идеально соответствовал вашим потребностям.

#include <boost/type_traits/make_unsigned.hpp>

template<class T>
T unsigned_shift(const T&t, unsigned int s)
{
    return ((make_unsigned<T>::type)t)>>s;
}

(я изменил тип s на unsigned int, потому что операция операторов сдвига не определена для отрицательных значений второго операнда - см. §5.8 ¶1)

0 голосов
/ 11 июня 2011

Как насчет приведения к unsigned long, чтобы выполнить сдвиг, а затем приведения обратно к T, чтобы вернуть его?

Кроме того, в обычном дополнении к двойкам результат второго сдвига не будет равен 63не 64?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...