未知bitesize的模板整数

时间:2011-05-23 22:00:15

标签: c++ templates integer

如果我不知道字符串有多大,我如何将二进制/十六进制字符串转换为整数?

我想要atoi / atol做什么,但我不知道要输出什么,因为我不知道该值是32位还是64位。此外,atoi不会执行十六进制,因此101将变为101而不是0x101==257

我假设我需要使用template<typename T>,但是如何创建要在函数中输出的变量? T varname可以是任何东西,那么是什么使varname成为一个数字而不是一个指向某个随机位置的指针?

3 个答案:

答案 0 :(得分:3)

模板是编译时的东西。您无法在运行时选择数据类型。如果输入值不超过64位类型的范围,则只需使用64位类型。

进行转换的一种方式(但绝不是唯一的方法)如下:

template <typename T>
T hex_to_int(const std::string &str)
{
    T x;
    std::stringstream(str) >> std::hex >> x;
    return x;
}

std::string str = "DEADBEEF";  // hex string
uint64_t x = hex_to_int<uint64_t>(str);
std::cout << x << std::endl;  // "3735928559"

答案 1 :(得分:2)

你只需要定义一个bigInt类,然后将你的字符串解析成该类;像这堂课一样:https://mattmccutchen.net/bigint/

答案 2 :(得分:0)

也许就像未经测试的那样:

int  // or int64 or whatever you decide on
hexstr2bin ( char *s ) {  // *s must be upper case
int result = 0;     // same type as the type of the function
  while ( *char ) {
    result <<= 16;
    if ( *char ) <= '9' {
      result += *char & 0xF;
    }
    else {
      result = ( *char & 0xF ) + 9;
    }
  }
  return result;
}