【问题标题】:C++ casting template parameter to its unsigned versionC++ 将模板参数转换为其未签名版本
【发布时间】:2018-06-09 21:17:41
【问题描述】:

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

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

基本类型和大小: 数值范围

  • signed char: 1Byte,8 bits,[-127,127] 用于补码或[128,127] 用于补码
  • unsigned char: 1Byte, 8 bits, [0,255]

我可以通过在我的模板类中使用该类型的unsigned version 来更轻松地获得最大值(此处为伪代码):

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 成员表示此类型可以存储的可行二进制位组合的总数。例如:charunsigned char 的标准 8 bit byte 都有最大数量的 256 二进制位组合。

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

【问题讨论】:

  • 我想你在找std::numeric_limits
  • @EmeraldWeapon 对图书馆的那部分不熟悉...我得研究一下。
  • @EmeraldWeapon 好吧,我正在尝试编写一个类模板,它将采用基本类型并将该类型通常作为有效参数接受的任何值传递给它,然后它将处理有关该类型的信息并且使用 ostream 运算符将显示值、以字节/位为单位的大小、最大存储值表示以及该值相对于该类型的二进制位模式。
  • 虽然这至少在某种程度上可能是一个 XY 问题,但std::make_unsigned 应该有助于完成您所说的任务。
  • 您想要最大还是不同值的数量?你需要它们做什么?

标签: c++ templates casting


【解决方案1】:

maxVal 设置为size_ == sizeof(long long) ? (uLL) -1 : (1uLL &lt;&lt; size_) - 1 应该可以解决问题。

【讨论】:

  • 我可以使用它,但我正在尝试使其尽可能通用和自动化。但是,std::numeric_limits&lt;T&gt;::max() 会返回它可以容纳的最大值,还是二进制组合的总数?
  • std::numeric_limits::max() 将返回 T 可以容纳的最大值。对于有符号类型,它将返回小于 2^sizeof(T) - 1。
  • 1 &lt;&lt; size_int 为32 位且size_ &gt;= 32 时导致UB。
  • @haaawk 是的,我不需要变量可以保持的最大值;我需要该类型的无符号版本的最大值。 unsigned char(-1) 返回 255,这是必需的,而不是 char(-1)unsigned short(-1) 返回 65535 而不是 short(-1)
  • @FrancisCugler 然后将maxVal 设置为size_ == sizeof(long long) ? (uLL) -1 : (1uLL &lt;&lt; size_) - 1 就可以了。我不知道您打算如何使此模板与 float 和 double 一起使用,但对于整数类型,这将起作用。
猜你喜欢
  • 2013-10-13
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多