我想编写一个函数,对EDIT: This is the text in the file that I need to read
https://pastebin.com/gc9vFLGD
and this is the code that I have tried.
https://pastebin.com/uDfasn7i
类型的参数执行按位操作。
self.scene?.view
或auto
类型(宽度不同)。unsigned int
类型执行按位操作。我需要一个返回原始数据类型int
版本的运算符。在下面的函数示例中,“operator”unsigned
会为我提供unsigned
具有的数据类型,但确保它是无符号的。
unsigned_type
- > value
int
- > unsigned int
int16_t
- > uint16_t
功能示例:
uint16_t
是否有某些方法可以针对从uint16_t
获取的数据类型执行操作auto bit_shifting_and_mask(auto value) -> decltype(value)
{
unsigned_type(value) unsigned_value = static_cast<unsigned_type(value)>(value);
unsigned_value >>= 8u; // Contrived bit manipulation
unsigned_value &= 0xABCDu; // here ...
return static_cast<decltype(value)>(unsigned_value);
}
?
感谢。
答案 0 :(得分:3)
C ++ 11在<type_traits>
中有std::make_unsigned
实用程序:
auto bit_shifting_and_mask(auto value) -> decltype(value)
{
auto unsigned_value = static_cast<std::make_unsigned<decltype(value)>::type>(value);
unsigned_value >>= 8u; // Contrived bit manipulation
unsigned_value &= 0xABCDu; // here ...
return static_cast<decltype(value)>(unsigned_value);
}
使用C ++ 14,您可以使用std::make_unsigned_t
代替std::make_unsigned::type
进一步简化。
答案 1 :(得分:2)
make_unsigned,正如Jarod42所说。
auto bit_shifting_and_mask(auto value) -> decltype(value)
这不是您希望使此函数依赖于类型的方式。使用模板,除非此函数是lambda。
答案 2 :(得分:2)
这不需要标准中尚未提供的功能。它在VS 2017下编译,启用VC ++ 17。
#include <type_traits>
template<typename T>
auto bit_shifting_and_mask(T value) {
static_assert(std::is_integral_v<T>,
"bit_shifting_and_mask(value): value is not integral type");
using unsgn =std::make_unsigned_t<T>;
auto unsigned_value = static_cast<unsgn>(value);
unsigned_value >>= 8u; // Contrived bit manipulation
unsigned_value &= 0xABCDu; // here ...
return unsigned_value;
}