2015-07-11 1 views
2

Так что я пытался сделать «зацикливание» побитового сдвига в C++ (11), и я получил основной код к этому:Как изменить TYPENAME, подписанную-Несс в функции шаблона C++

#include <cstdio> 
#include <limits> // is_signed 
#include <limits.h> // CHAR_BIT 

template<typename T> 
T rotl(T input, unsigned int shift) 
{ 
    return (input<<shift)|(input>>(sizeof(T)*CHAR_BIT-shift)); 
} 

template<typename T> 
T rotr(T input, unsigned int shift) 
{ 
    return (input>>shift)|(input<<(sizeof(T)*CHAR_BIT-shift)); 
} 

int main() 
{ 
    int i = -5; 

    std::printf("%i\n", i); 

    i = rotl(i, 4); // or other value 
    std::printf("%i\n", i); 

    i = rotr(i, 4); // same value as above 
    std::printf("%i\n", i); 
} 

Это дает мне ожидаемое поведение, когда выход будет выглядеть следующим образом:

-5 
-1 
-1 

Поскольку ИНТ я подписан, однако, если я делаю это в коде:

i = (int)rotl((unsigned int)i, 4); 
. . . 
i = (int)rotr((unsigned int)i, 4); 

Выход становится:

-5 
-65 
-5 

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

T rotr(T input, unsigned int shift) 
{ 
    if(std::numeric_limits<T>::is_signed == false){ 
     return() 
    }else{ 
     return // problem here 
    } 
} 

Но я не могу показаться, чтобы выяснить, как повернуть вокруг подписанного Несс Т, (unsigned T) недопустим для typenames. Так как же я буду делать это? Я бы предпочел не использовать ничего, кроме стандартных библиотек (личный вкус действительно), но если нет правдоподобного способа сделать это, я мог бы рассмотреть варианты без std.

ответ

2

Как celticminstrel предложил использовать std::make_unsigned<T>::type

Вот как:


template&lttypename T> 
T rotl(T input, unsigned int shift) 
{ 
    typename std::make_unsigned&ltT>::type ii = static_cast&lttypename std::make_unsigned&ltT>::type>(input); 
    return static_cast&ltT>((ii<<shift)|(ii>>(sizeof(T)*CHAR_BIT-shift))); 
} 
+0

Спасибо, ожидание было из-за пьянства (до сих пор пьян ТБХ), работал безупречно, что мне нужно. Спасибо всем, что внесли свой вклад. – MetroidChild

+0

@MetroChild. Не беспокойся. Был там. :-) –

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