gpt4 book ai didi

c++ - 将 std::string(保证数字)转换为无符号字符

转载 作者:行者123 更新时间:2023-11-30 02:43:33 25 4
gpt4 key购买 nike

我创建了一个模板,用于将字符串转换为不同的数据类型,但当数据类型为 unsigned char 时出现问题。

template<class TYPE>
bool TryParse(const std::string value, TYPE &out)
{
std::istringstream iss(value);
iss >> out;

if (iss.fail())
{
return false;
}

return true;
}

问题是 istringstream 会将它看到的第一个字符视为字符,而不是将其视为数字字符串。因此,如果我传递值“255”,则返回值将为“2”。

最好的解决方案是将 out 变量转换为 unsigned int,执行操作,然后再次转换回来吗?

最佳答案

我建议有一个特别适用于 unsigned char 情况的重载,因为您需要使用中间类型。

bool TryParse(const std::string & value, unsigned char & out)
{
std::istringstream iss(value);
unsigned int i;
iss >> i;

if (iss.fail()) { return false; }

// The less-than-min check is technically redundant because both i and out
// are unsigned, but it makes me feel better having it there. It will become
// necessary for the "signed char" overload, anyway.
if (i > std::numeric_limits<unsigned char>::max() ||
i < std::numeric_limits<unsigned char>::min()) {
throw std::overflow_error();
// Or you could "return false" instead, if that makes more sense.
}

out = static_cast<unsigned char>(i);
return true;
}

您可以为 signed char 使用几乎相同的函数。 (只需将每个 unsigned 替换为 signed。)

我不建议在您的模板中使用中间类型,因为您需要使用尽可能广泛的类型,而且没有任何一种类型可以工作。例如,unsigned long long intsigned long long int 不兼容,反之亦然——而且这些类型都不与 兼容 float double。拥有一个直接使用所请求类型的基本模板,并对有问题的类型(例如 char)进行重载是正确的方法。


请注意,我已将 value 参数更改为对 const string 的引用,因为这意味着调用者无需无缘无故地复制该字符串。我建议您也更改模板函数。

关于c++ - 将 std::string(保证数字)转换为无符号字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043298/

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