我想在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)
如果您可以使用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)
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |