gpt4 book ai didi

C++ 将模板参数转换为其无符号版本

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:59 26 4
gpt4 key购买 nike

我正在开发一个类模板,它采用任何类型的单个参数 T。现在我对整数类型感兴趣;稍后,当我扩展此类以使用 浮点类型 时,我将专门化此类。

在这个类中,我有一个成员变量,它将存储可以存储在此类型中的最大位表示数。例如:

基本类型和大小: 值范围

  • signed char: 1Byte,8 bits,[-127,127]对于一个补码或 [128,127] 对于两个补码
  • unsigned char: 1Byte, 8 bits, [0,255]
  • 等等

通过使用该类型的未签名版本,我可以更轻松地获得最大值,因此在我的模板类中(此处为伪代码):

template<class T>
binaryRep {
T t_; // store the value
std::size_t size_ = sizeof( T ); // size in bytes
std::size_t maxVal = T( -1 ); // This is where I need T to be it's unsigned version.
};

如果有人要这样使用这个模板类:

void someFunc() {
binaryRep<unsigned char> binUC; // This works fine

binaryRep<char> binSC; // Not giving the needed results.
}

在类的构造函数中是否有一种方法可以将 T 转换为 unsigned T

在我的构造函数中,我试图做这样的事情:

binaryRep( const T& t ) : t_( static_cast<unsigned T>( t ) ) {
}

然而,这不会编译,也不认为它会......但这种性质的东西正是我在这里需要的。

[注意:] - 此类中的 maxValue 成员表示此类型可以存储的可行二进制位组合的总数。例如:标准 8 位 bytecharunsigned char 都有最大数量的 256 二进制位组合。

如果您需要比这更多的信息,请告诉我。

最佳答案

据我所知,没有STLC++ 中给你一个 unsigned datatypesigned版本。

但是,自己编写来获得 unsigned 并不难对应类型 signed数据类型。

这是我为您创建的代码示例。

template<typename T>
struct remove_signed { };

template<>
struct remove_signed<char> { typedef unsigned char Type; };

template<>
struct remove_signed<signed char> { typedef unsigned char Type; };

template<>
struct remove_signed<signed short int> { typedef unsigned short int Type; };

template<>
struct remove_signed<signed int> { typedef unsigned int Type; };

template<>
struct remove_signed<signed long int> { typedef unsigned long int Type; };

template<>
struct remove_signed<signed long long> { typedef unsigned long long Type; };


template<typename T>
using remove_signed_t = typename remove_signed<T>::Type;


int main(int argc, char** argv)
{

signed int x;
remove_signed<decltype(x)>::Type y; //y is unsigned int

signed char k;
remove_signed<decltype(k)>::Type l; //l is unsigned char

//or
remove_signed_t<decltype(k)> g; //g is unsigned char

return 0;
}

祝你好运。

编辑:正如@HolyBlackCat 所提到的,有 std::make_unsigned这可以给你unsigned signed 的数据类型类型并且它完全按照上面的代码实现,所以如果你想知道如何std::make_unsigned有效,您可以检查代码。

关于C++ 将模板参数转换为其无符号版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48022481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com