为什么没有std :: stou?

时间:2012-01-03 16:21:32

标签: c++ string c++11 std

C ++ 11添加了一些新的字符串转换函数:

http://en.cppreference.com/w/cpp/string/basic_string/stoul

它包括stoi(string to int),stol(string to long),stoll(string to long long),stoul(string to unsigned long),stoull(string to unsigned long long)。值得注意的是它是一个stou(字符串到无符号)函数。有什么理由不需要它,但所有其他的都是吗?

相关:No "sto{short, unsigned short}" functions in C++11?

3 个答案:

答案 0 :(得分:25)

最简单的答案是C库没有相应的“strtou”,而C ++ 11字符串函数都只是围绕C库函数的薄弱包装:std::sto*函数镜像strto*std::to_string函数使用sprintf


编辑:正如KennyTM所指出的那样,stoistol都使用strtol作为基础转化函数,但是当存在使用stoul的{​​{1}}时仍然是神秘的strtoul,没有相应的stou

答案 1 :(得分:20)

我不知道为什么stoi存在而不是stou,但stoul和假设stou之间的唯一区别是检查结果是否为范围unsigned

unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) {
    unsigned long result = std::stoul(str, idx, base);
    if (result > std::numeric_limits<unsigned>::max()) {
        throw std::out_of_range("stou");
    }
    return result;
}

(同样地,stoi也类似于stol,只是使用不同的范围检查;但由于它已经存在,因此无需担心如何实现它。)

答案 2 :(得分:0)

unsigned long ulval = std::stoul(buf);
unsigned long mask = ~0xffffffffl;
unsigned int uival;
if( (ulval & mask) == 0 )
    uival = (unsigned int)ulval;
else {
    ...range error...
}

使用掩码以掩码中表示的位数表示的期望值大小来执行此操作,将使其适用于64位长对32位整数,但也适用于32位长对32位整数。 >

在使用64位长的情况下,〜0xffffffffl将变为0xffffffff00000000,因此将查看是否设置了前32位。如果使用32位长,则〜0xffffffffl变为0x00000000,掩码检查将始终为零。