C++中的unsigned shift模板

4 c++ templates

我想在C++中做一个无符号的转换.这是我的示例代码.问题在于它不是通用的.这段代码完全错误.它不适用于longs,它不适用于较小的类型,如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);
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*lia 6

如果您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

(我更改了sto 的类型,unsigned int因为对于第二个操作数的负值,移位运算符的操作未定义 - 参见§5.81)