c ++自动类型与无符号转换签名

时间:2018-02-22 00:32:06

标签: c++ c++11 c++14

我想编写一个函数,对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); }

感谢。

3 个答案:

答案 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;
}